假设参数中有一个列表,其头部和尾部分别匹配模式,因此我们使用x:xs
。这意味着输入被划分为值CCD_ 2和列表CCD_。
因此,冒号之前的内容将被视为单个值,冒号符号中最后的内容将是列表的其余部分,其中删除了单个值x
。
但是,如果我想将最后一个值与其他值分开呢?看来这个符号不能用了。
更新:我想我知道如何使用递归找到最后一个数字,但你不能简单地通过某种模式匹配来获得它,这是真的吗?
Haskell数据类型[a]
将列表表示为一个单独链接的cons列表:模式匹配x:xs
不仅仅是符号,它实际上是存储在内存中的方式,作为头和其余部分的cons。
正如您在更新中提到的,您可以编写一个函数,该函数遍历列表并将其拆分为init部分和最后一个元素:
unsnoc :: [a] -> Maybe ([a], a)
您可以使用视图模式在模式匹配中使用它:
f (unsnoc -> Just (xs, x)) = ...
f [] = ...
你甚至可以把它包装成一个模式同义词:
pattern xs :> x <- (unsnoc -> Just (xs, x))
(或双向版本
pattern xs :> x <- (unsnoc -> Just (xs, x)) where
xs :> x = xs ++ [x]
)
允许您编写
f (xs :> x) = ...
f [] = ...
但是,请注意,所有这些方法仍然需要遍历整个列表的主干,因为它们最终都只是调用unsnoc
函数。
对于任意列表,你不能,但对于固定大小的列表,你可以模式匹配到最后一个元素(或任何其他任意元素),例如
lastof4 [_,_,_,x] = x
lastof4 [1..4]
4