地图与过滤无限列表?

Dem*_*dus 7 haskell

我正在学习Haskell,我遇到了一些我无法理解的东西,我无法找到解释.所以,我在无限列表上测试了一些函数,看看它们是如何工作的,我发现了地图和滤波器之间的差异,我想了解一下.

Prelude.map 定义:

map _ []     = []
map f (x:xs) = f x : map f xs
Run Code Online (Sandbox Code Playgroud)

Prelude.filter 定义:

filter _pred []    = []
filter pred (x:xs)
  | pred x         = x : filter pred xs
  | otherwise      = filter pred xs
Run Code Online (Sandbox Code Playgroud)

如果我运行这个:

map (==5) [1..]
Run Code Online (Sandbox Code Playgroud)

输出开始,它永远不会结束,直到我停止它.因为列表是无限的,所以很有意义.

但现在如果我运行这个:

filter (==5) [1..]
Run Code Online (Sandbox Code Playgroud)

我什么也看不见,甚至没有[5,.这也是有道理的,因为列表也是无限的,但是我想要了解beetwen map和filter的区别是什么.谢谢你,对不起我的英文!

编辑:我使用的是tryhaskell.org,这就是问题所在!

ick*_*fay 8

正如在评论中发现的那样,这是由于使用了Try Haskell.从实验开始,在结束并向您发送结果之前,它似乎将等待程序终止,3秒钟过去或产生1024个字符的输出.不幸的是,filter (==5) [1..]只会产生一个可怜的两个字符([5),不符合1024个字符的限制,并且由于某种原因,Try Haskell不会发[5回给你.在真正的GHCi中运行它应该可以正常工作.