该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。