【发布时间】:2012-04-26 15:18:35
【问题描述】:
我在 ghci 中输入了以下内容,认为会发生以下两种情况之一: 1) 解释器会挂起,搜索无限列表的每个成员以匹配谓词;或 2) 通过幕后的 Haskell 柔术,解释器会以某种方式找出序列在 4 处终止并停在那里。
[x | x <- [1..],5>x]
结果 1 就是发生的事情。现在,结果 2 要求很高。但是既然人类可以证明序列在 4 处终止,那么有没有办法让解释器来做呢?是否可以将其重写为终止?事实上,曾经有一个谓词可以从无限列表中产生有限的理解吗?
【问题讨论】:
-
takeWhile (< 5) [1..] -
@Mog:虽然我同意你的评论,但你在某种程度上改变了理解的含义,这不是作弊吗?
-
人类证明程序某事的能力并不总是自动程序可以模仿的:您可以推断某些特定程序可以终止,但通常这是不可能的计算(这是停止问题,无法确定)。而且你可以在列表推导中编写任何你想要的代码,所以我相信在一般情况下编译器将很难推理你的列表推导。
-
@gcbenison:
takeWhile不是灵丹妙药。它仅在所需的输出列表是输入列表的前缀时才有效。 -
但是,
takeWhile (< 5) [1,2,3,5,4]将只生成[1,2,3]。
标签: haskell