列表理解:从0到x的偶数

Alw*_*esh 3 haskell list-comprehension function list filter

我目前正在学习Haskell,我必须说,我过得很糟糕。

我的任务是创建一个函数evens,该函数接受一个值x,并返回从0to到所有偶数的列表x

例如:

>  evens 10

> [2,4,6,8,10]
Run Code Online (Sandbox Code Playgroud)

我一直在尝试使用列表理解来修改一些示例函数,以实现我的目标,但是我简直陷入了很多错误,更糟糕的是,即使我尝试了很多事情,所有的一切都变得令人困惑。

我最后的尝试如下:

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]

我确实看到它期望布尔值,但是坦率地说,我不知道在哪里或为什么。

任何帮助将不胜感激。我从没有使用过函数式编程语言的经验,并且很难弄清自己在思想上的错误。我觉得我已经超出了这个简单的问题,以至于难以置信。

Wil*_*ess 7

只需filter从该代码中删除单词即可。

Boolean所预计的even x。当该值为时Truex将包括在输出列表中。

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是一个类型的变量一样abt或...。它不是一种类型,就像Int。因此,您获得的默认值是Integer