如何“施放”联盟类型榆树

时间:2015-12-04 16:36:20

标签: elm

让我们说我有两种类型的别名:

type alias A = {...}
type alias B = {...}

和联合类型

type Content = A | B

和模型类型

type alias Model= {cont : Content, ...}

init : Content -> Model
init cont = {cont = cont, ...}

如何将类型A的记录传递给init。

a : A
a = {...}
init a 

引发以下错误:

Detected errors in 1 module.
## ERRORS in Main.elm ##########################################################

-- TYPE MISMATCH ------------------------------------------------------ Main.elm

The 1st argument to function `init` has an unexpected type.

78|               init e
                       ^
As I infer the type of values flowing through your program, I see a conflict
between these two types:

    Content

    A

我认为A是内容的一种“子类型”。我不能只写

a:Content
a = {...}
init a

因为一些逻辑对内容进行了案例分析

1 个答案:

答案 0 :(得分:7)

榆树的联盟类型是所谓的歧视联盟(或标记的联盟)。区分部分是标签或构造函数。在这种情况下,我认为你想要:

type Content = TagA A | TagB B

请注意,第一个大写名称是标记,其他任何类型或类型变量。

现在你可以做到:

a : A
a = { ... }
init (TagA a)

init范围内,您可以通过以下方式区分这两种类型:

init content =
  case content of
    TagA a -> ...
    TagB b -> ...