【发布时间】:2021-12-26 02:24:07
【问题描述】:
阅读 Get Programming with Haskell 一书,其中一个问题是找出给定元素是否在列表的前半部分。这可以这样做
isInFirstHalf x xs = elem x firstHalf
where firstHalf = take (length xs `div` 2) xs
但是,问题是这里length 遍历了整个列表。在命令式语言中,可以通过跟踪元素索引和当前计数器来提前缩短循环。例如。如果列表有一百万个元素,并且第三个元素匹配,一旦你完成了第六个元素的循环,你可以立即返回 true。
我的问题是是否有办法在 Haskell 中实现类似的功能。
【问题讨论】:
-
您可以肯定地跟踪索引,但是您如何知道索引是否在上半年结束?你仍然需要长度。大多数命令式语言的不同之处在于它们中的大多数使用数组,而不是列表(即使他们称它们为列表),其中长度为 O(1)。你猜怎么着? Haskell 也有数组!
-
@FyodorSoikin 你有没有错过 Q 中的这一部分,“例如,如果列表有一百万个元素,并且第三个元素有匹配,一旦你完成了第六个元素的循环,你可以立即返回 true”? :)
-
啊,是的,我完全做到了
标签: haskell