假设我们在头部和尾部的参数和模式匹配中有一个列表,所以我们使用x:xs
。这意味着输入分为值x
和列表xs
。
因此,无论结果被视为单个值,结肠符号中的最后一个是列表的其余部分,其中单个值x
被删除。
但是如果我想将最后一个值与其余值分开呢?看来这个符号无法使用。
更新:我想我知道如何使用递归找到最后一个数字,但是你不能简单地通过某种模式匹配来获得它吗?
答案 0 :(得分:2)
Haskell数据类型DragImg
将列表表示为单链接的缺点列表:模式匹配[a]
不仅仅是符号,而且它实际上是如何存储在内存中的,如头脑和其他人的缺点。
正如您在更新中提到的,您可以编写一个函数,该函数遍历列表并将其拆分为init部分和最后一个元素:
x:xs
您可以使用view pattern在模式匹配中使用它:
unsnoc :: [a] -> Maybe ([a], a)
你甚至可以把它包装成pattern synonym:
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 [] = ...
函数。
答案 1 :(得分:0)
对于任意列表,您不能但是对于固定大小的列表,您可以将模式匹配到最后一个元素(或任何其他任意元素),例如
lastof4 [_,_,_,x] = x
lastof4 [1..4]
4