Haskell 无限列表上的映射与过滤器?

Haskell 无限列表上的映射与过滤器?,haskell,Haskell,我在学习哈斯克尔,我遇到了一些我无法理解的事情,也找不到解释。所以,我在无限列表上测试了一些函数,看看它们是如何工作的,我发现了map和filter之间的差异,我想了解一下 Prelude.map定义: map _ [] = [] map f (x:xs) = f x : map f xs filter _pred [] = [] filter pred (x:xs) | pred x = x : filter pred xs | otherwise

我在学习哈斯克尔,我遇到了一些我无法理解的事情,也找不到解释。所以,我在无限列表上测试了一些函数,看看它们是如何工作的,我发现了map和filter之间的差异,我想了解一下

Prelude.map
定义:

map _ []     = []
map f (x:xs) = f x : map f xs
filter _pred []    = []
filter pred (x:xs)
  | pred x         = x : filter pred xs
  | otherwise      = filter pred xs
Prelude.filter
定义:

map _ []     = []
map f (x:xs) = f x : map f xs
filter _pred []    = []
filter pred (x:xs)
  | pred x         = x : filter pred xs
  | otherwise      = filter pred xs
如果我运行这个:

map (==5) [1..]
输出开始,它永远不会结束,直到我停止它。Wich是有意义的,因为列表是无限的

但是现在如果我运行这个:

filter (==5) [1..]
我什么也没看到,甚至连
[5,
都没有。 这也是有意义的,因为列表也是无限的,但我想了解映射和过滤器之间的区别。 谢谢你,对不起我的英语


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

正如在评论中发现的,这是由于使用。从实验来看,在结束并发送结果之前,它似乎会等待程序终止、等待3秒或等待生成1024个字符的输出。不幸的是,
过滤器(=5)[1..]
只会产生两个字符(
[5
),不满足1024个字符的限制,出于某种原因,Haskell不会发送
[5
返回给您。在真正的GHCi中运行它应该可以正常工作。

它与相关。编译它时,默认情况下,stdin和stdout的缓冲模式通常设置为LineBuffering,仅在换行符上打印,缓冲区溢出或手动刷新

GHCi的BufferMode被设置为NoBufferingª,它将立即打印您的结果

如果是行缓冲:

  • map(=5)[1..]
    打印其结果,因为它的大输出会导致大量缓冲区溢出
  • 过滤器(=5)[1..]
    从不填充缓冲区或写入换行符。因此它不会被打印

如果可能的话。

你肯定看到了
[5
,然后什么都没有了吗?我只是编辑过,我甚至没有看到[5]在我这方面是不可复制的。我看到了
[5
。那没有意义。你在使用哪个编译器/解释器?可能是因为我在使用。我将下载Haskell plataform并在那里尝试!