Alw*_*esh 3 haskell list-comprehension function list filter
我目前正在学习Haskell,我必须说,我过得很糟糕。
我的任务是创建一个函数evens,该函数接受一个值x,并返回从0to到所有偶数的列表x。
例如:
Run Code Online (Sandbox Code Playgroud)> evens 10 > [2,4,6,8,10]
我一直在尝试使用列表理解来修改一些示例函数,以实现我的目标,但是我简直陷入了很多错误,更糟糕的是,即使我尝试了很多事情,所有的一切都变得令人困惑。
我最后的尝试如下:
evens :: int -> [int]
evens n = [x | x <- [0..n], filter even x]
Run Code Online (Sandbox Code Playgroud)
它产生了错误:
ex1.hs:9:29:错误:
•无法将预期类型“布尔”与实际类型“ [整数]”匹配
•在表达式中:
filter even x在列表理解的步骤中:
filter even x在表达式中:
[x | x <- [0 .. n], filter even x]
我确实看到它期望布尔值,但是坦率地说,我不知道在哪里或为什么。
任何帮助将不胜感激。我从没有使用过函数式编程语言的经验,并且很难弄清自己在思想上的错误。我觉得我已经超出了这个简单的问题,以至于难以置信。
只需filter从该代码中删除单词即可。
该Boolean所预计的even x。当该值为时True,x将包括在输出列表中。
filter是创建列表的功能,但是列表理解本身已经在创建列表。
实际上,filter p可以编码为
filter p xs = [x | x <- xs, p x]
Run Code Online (Sandbox Code Playgroud)
因此filter,在内部使用非常多余。
关于该错误消息。你说
我确实看到它期望布尔值,但是坦率地说,我不知道在哪里或为什么。
但错误信息表明,美国在那里:
ex1.hs:9:29:错误:
•无法将预期类型“布尔”与实际类型“ [整数]”匹配
•在表达式中:
filter even x
这是哪里。这是最直接的罪魁祸首:表达filter even x。它是其实际类型,[Integer]与预期的类型不匹配Bool。
在列表理解的步骤中:
filter even x
那表情似乎在为“语句”在我们的名单理解的语句,
在表达式中:
[x | x <- [0 .. n], filter even x]
这是上面的完整表达。所以我们只需要阅读这些邮件由内而外,找到我们的(立即)发生错误的方式。
因此,从列表理解的上下文来看[ r | x <- xs, q],q期望类型为Bool。
但其本身q = filter even x具有type [Integer],即整数列表。
为什么?因为(具有与此上下文相关的简化的非多态类型)
filter :: (Integer -> Bool) -> [Integer] -> [Integer]
even :: (Integer -> Bool)
-----------------------------------------------------------
filter even :: [Integer] -> [Integer]
xs :: [Integer]
-----------------------------------------------------------
filter even xs :: [Integer]
Run Code Online (Sandbox Code Playgroud)
(读::作“有类型”);而
even :: (Integer -> Bool)
x :: Integer
---------------------------
even x :: Bool
Run Code Online (Sandbox Code Playgroud)
如果你想知道为什么它Integer,即使你写的int,简单的答案是,int是一个类型的变量一样a或b或t或...。它不是一种类型,就像Int。因此,您获得的默认值是Integer。
| 归档时间: |
|
| 查看次数: |
139 次 |
| 最近记录: |