Prelude显示 take
的示例和 drop
带有否定论点:
take (-1) [1,2] == []
drop (-1) [1,2] == [1,2]
为什么这些以它们的方式定义,例如
x !! (-1)
“更安全”的事情和崩溃?即使论点没有意义,这似乎也是一种使这些函数成为整体的黑客且非常不像 Haskell 的方式。这背后是否有一些我没有看到的更大的设计理念?标准是否保证了这种行为,或者这正是 GHC 决定实现它的方式?
最佳答案
制作 take
主要有一个很好的理由部分:它可以保证结果列表,如果有的话,总是有请求的元素数量。
现在,take
已经在另一个方向上违反了这一点:当您尝试获取比列表中更多的元素时,只需获取尽可能多的元素,即少于请求的元素。也许不是最优雅的事情,但在实践中,这往往会非常有用。take
的主要不变量与 drop
结合使用:
take n xs ++ drop n xs ≡ xs
即使
n
也是如此是负数。不检查列表长度的一个很好的理由是它使函数在惰性无限列表上表现良好:例如,
take hugeNum [1..] ++ 0 : drop hugeNum [1..]
马上给
1
作为第一个结果元素。如果 take
是不可能的和 drop
首先必须检查输入中是否有足够的元素。
关于haskell - 为什么为否定参数定义 `take` 和 `drop`?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31648003/