繁体   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