首页 > 解决方案 > 在 Haskell 中不断收到解析缩进错误我做错了什么

问题描述

cube = x*x*x
cube xs = map cube [x | x <-xs] 
           where x mod 2 == 1

所以我试图得到列表的奇数

谢谢大家的帮助!

标签: haskell

解决方案


上面的代码片段包含一些错误:

  1. 您在这里where用作过滤器,但在 Haskell 中,where 子句用于定义局部范围的变量;
  2. 你只定义(x:xs)模式,所以即使这样有效,它也会在空列表上出错;
  3. [x | x <- xs]只是列表的恒等函数,因此我们可以省略它,此外,建议不要将变量命名为与“外部”变量相同的名称,因为这会造成混淆;和
  4. x mod 2 == 1可以替换为odd :: Integral i => i -> Bool

我们可以这样写来解决这个问题:

cubeOdds2 :: Integral i => [i] -> [i]
cubeOdds2 = map cube . filter odd
    where cube x = x * x * x

例如:

Prelude> cubeOdds2 [1,4,2,5]
[1,125]

因此,我们在这里使用filter :: (a -> Bool) -> [a] -> [a]过滤列表,以便只保留奇数,然后使用作为函数map :: (a -> b) -> [a] -> [b]对这些元素执行映射,cube该函数接受一个元素并返回该元素的映射。


推荐阅读