为什么foldr对于haskell中的元组并不懒惰

uv.*_*ita 3 haskell lazy-evaluation fold

写这样的东西是可以的:

head $ foldr (:) [] [1..]
-- 1
Run Code Online (Sandbox Code Playgroud)

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

head . fst $ foldr (\ x (ls, _) -> (x : ls, 0)) ([], 0) [1..]
Run Code Online (Sandbox Code Playgroud)

我需要这个的原因是因为我想在内部函数中传递生成元素的计数.像那样:

foldr go ([], 0) [1..]
go num (ls, cnt) = -- use cnt to get l and produce new pair (l : ls, cnt + 1)
Run Code Online (Sandbox Code Playgroud)

luq*_*qui 11

模式匹配默认是严格的.那是,

(\(x,y) -> (1:x,y)) _|_ = _|_
Run Code Online (Sandbox Code Playgroud)

但是,您可以使用模式使用延迟模式匹配~:

(\ ~(x,y) -> (1:x,y)) _|_ = (1:_|_, _|_)
Run Code Online (Sandbox Code Playgroud)