构造类型
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
由于类型变量 a
,任何类型都可以包裹Maybe
类型。因此,Maybe Int
,Maybe (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
时的逻辑。