假设有一个简单的函数:
maximum' :: (Ord a) => [a] -> a
maximum' [] = error "maximum of empty list"
maximum' [x] = x
maximum' (x:xs) = max x (maximum' xs)
我理解这个想法和(x:xs)的作用。正如在这里详细解释的那样,What do the parentheses signify in (x:xs) when pattern matching?,但是有一件小事情我无法从我的头脑中消失。既然缺点:操作符将x附加到列表xs中,那么为什么当我们使用(x: xs )??时,x是函数参数列表的第一个元素,而xs是尾元素,就好像(x:xs)在参数列表上调用头尾一样。
发布于 2016-02-08 20:15:27
这只是一般模式的一个实例,类型的构造函数既用于构造该类型的元素,也用于解构。如果你写
data MyList a = Empty | Cons a (MyList a)
你会写
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)
但是,列表实际上定义为
data [a] = [] | a:as
因此,与其他数据类型一样,:
用于构造和解构非空列表。
发布于 2016-02-08 20:15:56
cons操作符不追加,而是预置。也就是说,x : xs
生成一个列表,其中包含x
作为其第一个元素,xs
作为其馀元素。因此,模式x : xs
同样匹配一个列表,其中x
作为第一个元素,xs
作为其余元素。
https://stackoverflow.com/questions/35278382
复制相似问题