Elm构造类型

示例

该type alias关键字组合给出了一个新的名称为一个类型,但type在隔离关键字声明一个新类型。让我们研究这些类型中最基本的一种:Maybe

type Maybe a
    = Just a
    | Nothing

首先要注意的是,该Maybe类型的类型变量声明为a。要注意的第二件事是竖线字符|,它表示“或”。换句话说,类型的东西Maybe a是无论是 Just a Nothing。

当你写上面的代码,Just并Nothing进入范围,因为价值的构造,并Maybe进入活动范围的类型构造。这些是他们的签名:

Just : a -> Maybe a

Nothing : Maybe a

Maybe : a -> Maybe a -- this can only be used in type signatures

由于type变量 a,任何类型都可以“包装在”该Maybe类型的内部。所以Maybe Int,Maybe (List String)或者Maybe (Maybe (List Html)),都是有效的类型。type使用case表达式解构任何值时,必须考虑该类型的每个可能实例。对于type的值Maybe a,必须同时考虑Just a大小写和Nothing大小写:

thing : Maybe Int
thing = 
    Just 3

blah : Int
blah =
    case thing of
        Just n -> 
            n

        Nothing ->
            42

-- blah = 3

尝试Nothing在case表达式中不包含子句的情况下编写以上代码:它不会编译。这就是使Maybe类型构造函数成为表示可能不存在的值的绝佳模式的原因,因为它迫使您处理值何时为的逻辑Nothing。