【发布时间】:2016-02-19 23:17:11
【问题描述】:
我一直在阅读Real World Haskell,并在第 2 章的练习中遇到了一个有趣的解决方案。
该练习要求读者构造一个行为类似于 Haskell 的 drop 的函数。一个solution 看起来像这样:
lastButOne :: [a] -> a
lastButOne (x:xs) = if length xs == 1
then x
else lastButOne xs
改进后的版本如下所示:
lastButOne :: [a] -> a
lastButOne (x1:[x2]) = x1
lastButOne (x:xs) = lastButOne xs
我很难理解中缀冒号在这里的作用。有人可以告诉我应该如何阅读这篇文章吗?
据我了解,elem:[b] 告诉 Haskell 将 elem 添加到 [b]。
但是假设我定义了一个类似lastButOne (x:xs) 的函数。然后假设我有一个列表testCase = [p,q..r]。假设lastButOne 将testCase 视为两个独立的对象,即[p] 和[q..r],我是否正确?
如果是这样的,阅读lastButOne 的第一次迭代感觉非常直观。但是我仍然不明白lastButOne 的第二次迭代是如何工作的。
【问题讨论】:
标签: haskell recursion pattern-matching operators