[英]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.