我们如何使用冒号表示法获取列表的最后一个值?

时间:2016-03-30 02:01:14

标签: haskell pattern-synonyms

假设我们在头部和尾部的参数和模式匹配中有一个列表,所以我们使用x:xs。这意味着输入分为值x和列表xs

因此,无论结果被视为单个值,结肠符号中的最后一个是列表的其余部分,其中单个值x被删除。

但是如果我想将最后一个值与其余值分开呢?看来这个符号无法使用。

更新:我想我知道如何使用递归找到最后一个数字,但是你不能简单地通过某种模式匹配来获得它吗?

2 个答案:

答案 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