haskell - 为什么为否定参数定义 `take` 和 `drop`?

标签 haskell

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/

相关文章:

haskell - 将表达式转换为无点样式(Haskell)

algorithm - 是否可以在单个递归过程中将分数减少到最低形式,而不使用 is_zero、succ 和 pred 以外的辅助函数?

haskell - “fix” 在非函数类型上的有用实例?

haskell - 在 Haskell 中将 foldr 与 OR 混合(懒惰?)

haskell - 如何使用 :? 在 ghci 中查找所有函数列表和手册

haskell - Traversable 和 MonoTraversable 之间有什么东西吗?

Haskell:阶乘函数有什么问题

haskell - 需要最简单的 Haskell 程序

haskell - 使用 Haskell 绑定(bind)保存脉冲音频流

haskell - 有人能解释一下 Haskell 中的遍历函数吗?