簡體   English   中英

在elm或haskell中擴充類型別名

[英]Augmenting type aliases in elm or haskell

假設我有一個類型為elm(0.18),如下所示:

type alias CatSimple = 
  { color : String
  , age : Int 
  , name : String
  , breed : String
}

我的項目要求我也有一個類型,其中包含前一個字段的所有字段,但還有一些其他字段:

type alias CatComplex =
  { color : String
  , age : Int 
  , name : String
  , breed : String
  , feral : Bool
  , spayed : Bool
} 

現在讓我們說我需要向CatSimple添加另一個字段。 我必須記得將它添加到CatComplex中。

我希望能夠動態擴充我的類型,以便我可以避免更新所有類型,或不得不求助於這樣的事情:

type alias CatComplex =
  { simpleData: CatSimple
  , feral : Bool
  , spayed : Bool
} 

在榆樹有沒有辦法做到這一點?

如果沒有,Haskell是否提供了這樣做的方法?

您可以在Elm中使用可擴展記錄來定義基本類型的字段組合:

type alias Cat c =
    { c
        | color : String
        , age : Int
        , name : String
        , breed : String
    }

type alias FeralCat =
    Cat
        { feral : Bool
        , spayed : Bool
        }

以下是如何使用它的示例:

feralCatSummary : FeralCat -> String
feralCatSummary { color, feral } =
    color ++ "; Feral? " ++ toString feral

main : Html msg
main =
    text <|
        feralCatSummary
            { color = "Blue"
            , age = 5
            , name = "Billy"
            , breed = "Bluecat"
            , feral = True
            , spayed = False
            }

簡短的回答是否定的,但是你可以做一些你想要的方向:

有一種類型,但額外的信息'可選'

type alias Cat =
  { color : String
  , age : Int 
  , name : String
  , breed : String
  , feral : Maybe Bool
  , spayed : Maybe Bool
 } 

如果要將CatComplex傳遞給僅使用Cat字段的函數,可以定義類型

 type alias CatGeneric a =       
    { a| 
          color : String
          , age : Int 
          , name : String
          , breed : String 
      }

然后

fn : CatGeneric a -> Bool 
....

如果你通過Cat或CatComplex,這應該輸入

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM