【发布时间】:2020-01-16 22:46:23
【问题描述】:
我目前正在学习 Haskell,我必须说,我过得很糟糕。
我的任务是创建一个函数 evens,它接受一个值 x,并返回从 0 到 x 的所有偶数值的列表。
例如:
> evens 10 > [2,4,6,8,10]
我一直在尝试使用列表推导来修改一些示例函数以实现我的目标,但是我只是被错误所困扰,更糟糕的是,即使我尝试了这么多事情,一切都是一个令人困惑的模糊。
我最后一次尝试如下:
evens :: int -> [int]
evens n = [x | x <- [0..n], filter even x]
它产生了错误:
ex1.hs:9:29: 错误:
• 无法将预期类型“Bool”与实际类型“[Integer]”匹配
• 在表达式中:
filter even x在列表理解中:
filter even x在表达式中:
[x | x <- [0 .. n], filter even x]
我确实看到它期待一个布尔值,但坦率地说,我不明白在哪里或为什么。
任何帮助将不胜感激。我从来没有任何函数式编程语言的经验,而且我很难弄清楚我的思想错误。我觉得我把这个简单的问题想多了,到了难以置信的地步。
【问题讨论】:
-
列表推导中的布尔表达式已被视为过滤器。你不需要说
filter even x,你只需说even x。此外,语言区分大小写,请确保在类型签名中使用Int而不是int。 -
很抱歉听到这个消息。 List comprehensions are fun。 :)
-
不值得写一个答案,但没有人告诉你最好的解决方案:
evens n = [0,2..n]。
标签: list function haskell filter list-comprehension