构造类型

type alias 关键字组合为类型提供了新名称,但隔离的 type 关键字声明了一种新类型。让我们来看看这些类型中最基本的一种: Maybe

type Maybe a
    = Just a
    | Nothing

首先要注意的是 Maybe 类型是使用 a类型变量声明的。需要注意的第二件事是管道字符|,它表示。换句话说,类型 Maybe a 的东西要么 Just a Nothing

当你编写上面的代码时,JustNothing 作为值构造函数进入作用域,Maybe 作为类型构造函数进入作用域。这些是他们的签名:

Just : a -> Maybe a

Nothing : Maybe a

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

由于类型变量 a,任何类型都可以包裹Maybe 类型。因此,Maybe IntMaybe (List String)Maybe (Maybe (List Html)) 都是有效的类型。当用 case 表达式解构任何 type 值时,必须考虑该类型的每个可能的实例化。对于 Maybe a 类型的值,你必须同时考虑 Just a case 和 Nothing case:

thing : Maybe Int
thing = 
    Just 3

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

        Nothing ->
            42

-- blah = 3

尝试在 case 表达式中没有 Nothing 子句编写上面的代码:它不会编译。这就是使 Maybe 类型构造函数成为表达可能不存在的值的一种很好的模式,因为它迫使你处理值为 Nothing 时的逻辑。