在elm或haskell中扩充类型别名

时间:2017-12-13 18:41:49

标签: haskell elm

假设我有一个类型为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是否提供了这样做的方法?

2 个答案:

答案 0 :(得分:7)

您可以在Elm中使用可扩展记录来定义一种基本的字段组合:

<?php
  echo "Worked!";
?>

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

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

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

答案 1 :(得分:2)

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

只有一种类型,但额外的信息'可选'

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

,则应进行此类型检查