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



假设参数中有一个列表,其头部和尾部分别匹配模式,因此我们使用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

相关内容

  • 没有找到相关文章

最新更新