在 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
}
假设我在 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
}