为什么该Haskell不动点计算不会终止?如何得到预期返回结果?
问题原因
- 你定义的
xs本质是无限递归结构,Haskell的惰性求值虽然可以生成前7个符合预期的元素,但求值器默认会尝试推导列表的尾部是否还有更多元素,不会主动在你预期的第7位停止。 - 当输出完第7个元素
4后,求值器需要判断列表是否已经结束(即是否遇到[]),此时需要计算second xs的第4个元素,这个值依赖xs的第8个元素,而xs的第8个元素又反过来依赖second xs的第4个元素,进入无限递归死锁,因此程序卡住不会终止。
解决方法
最简单的方案是手动指定你需要的列表长度,用take函数截断无限递归的求值过程:
second (x:y:xs) = y : second xs -- returns every second element of a list second _ = [] xs = take 7 $ [1,2,3,4] ++ second xs
此时在GHCi中求值xs就会直接输出[1,2,3,4,2,4,4]并正常终止,take 7会强制在获取到7个元素后停止后续的递归求值,避免死循环。
内容的提问来源于stack exchange,提问作者eivour
相关产品推荐
相关产品推荐

