假设有一个简单的函数:
maximum' :: (Ord a) => [a] -> a
maximum' [] = error "maximum of empty list"
maximum' [x] = x
maximum' (x:xs) = max x (maximum' xs)
Run Code Online (Sandbox Code Playgroud)
我了解这个想法以及(x:xs)的作用。正如这里详细解释的, 模式匹配时括号在(x:xs)中代表什么? 但是有一件事我无法摆脱。由于cons:operator将x附加到列表xs上,为什么当我们使用(x:xs)时x是函数参数列表的第一个元素,而xs是尾部?就像(x:xs)调用参数列表的开头和结尾。
这只是一般模式的一个实例,该类型的构造函数既可用于构造该类型的元素,也可用于解构。如果你写
data MyList a = Empty | Cons a (MyList a)
Run Code Online (Sandbox Code Playgroud)
你会写
maximum' :: (Ord a) => MyList a -> a
maximum' Empty = error "maximum of empty list"
maximum' (Cons x Empty) = x
maximum' (Cons x xs) = max x (maximum' xs)
Run Code Online (Sandbox Code Playgroud)
除了列表实际上是等效地定义为
data [a] = [] | a:as
Run Code Online (Sandbox Code Playgroud)
因此,与其他数据类型一样,:它用于构造和解构非空列表。