构造类型
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 时的逻辑。