小编use*_*627的帖子

缺乏理解无限列表和seq运算符

对于给定的整数n,下面的代码保留列表中的前n个项目,删除以下n个项目,保留以下n项,依此类推.它适用于任何有限列表.

为了使其可用于无限列表,我使用'seq'运算符在递归步骤之前强制累加器评估,如foldl'中所示.

我通过跟踪累加器的值进行测试,似乎有效列表可以根据需要进行有效计算.

然而,当应用于无限列表时,它不起作用.主函数中的"take"仅在内部计算终止时执行,当然,无限列表永远不会发生.

拜托,有人可以告诉我,我的错误在哪里?

main :: IO ()
main = print (take 2 (foo 2 [1..100]))

foo :: Show a => Int -> [a] -> [a]
foo l lst = inFoo keepOrNot 1 l lst []

inFoo :: Show a => (Bool -> Int -> [a] -> [a] -> [a]) -> Int -> Int -> [a] -> [a] -> [a]
inFoo keepOrNot i l  [] lstOut  = lstOut
inFoo keepOrNot i l lstIn lstOut = let lstOut2 = (keepOrNot …
Run Code Online (Sandbox Code Playgroud)

haskell lazy-evaluation

3
推荐指数
1
解决办法
232
查看次数

标签 统计

haskell ×1

lazy-evaluation ×1