我正在学习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,这就是问题所在!
正如在评论中发现的那样,这是由于使用了Try Haskell.从实验开始,在结束并向您发送结果之前,它似乎将等待程序终止,3秒钟过去或产生1024个字符的输出.不幸的是,filter (==5) [1..]只会产生一个可怜的两个字符([5),不符合1024个字符的限制,并且由于某种原因,Try Haskell不会发[5回给你.在真正的GHCi中运行它应该可以正常工作.
| 归档时间: |
|
| 查看次数: |
203 次 |
| 最近记录: |