在 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
} 

有没有办法在 Elm 中做到这一点?

如果没有,Haskell 是否提供了一种方法?

简短的回答是否定的,但是您可以按照自己的意愿做一些事情:

只有一种类型,但需要额外的信息'optional'

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

当您想将 CatComplex 传递给仅使用 Cat 字段的函数时,您可以定义一个 Type

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

然后

fn : CatGeneric a -> Bool 
....

如果您传递了 Cat 或 CatComplex,这应该进行类型检查

您可以在 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
            }