[x:xs)模式Haskell逻辑

A_P*_*A_P 0 haskell cons

假设有一个简单的函数:

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)调用参数列表的开头和结尾。

Lou*_*man 5

这只是一般模式的一个实例,该类型的构造函数既可用于构造该类型的元素,也可用于解构。如果你写

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)

因此,与其他数据类型一样,:它用于构造和解构非空列表。