为什么Haskell中的foldr对于元组不是惰性的

3

可以这样写:

head $ foldr (:) [] [1..]
-- 1

但是当我尝试处理元组时,它会进入无限循环:

head . fst $ foldr (\ x (ls, _) -> (x : ls, 0)) ([], 0) [1..]

我需要这个是因为我希望在内部函数中传递生成元素的数量。就像这样:
foldr go ([], 0) [1..]
go num (ls, cnt) = -- use cnt to get l and produce new pair (l : ls, cnt + 1)
1个回答

11

默认情况下,模式匹配是严格的。也就是说,

(\(x,y) -> (1:x,y)) _|_ = _|_

你可以使用惰性模式匹配,使用~模式:

(\ ~(x,y) -> (1:x,y)) _|_ = (1:_|_, _|_)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接