在哈斯克尔(Haskell)中,请继续遇到解析错误,我做错了什么


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

所以我正在尝试获取列表的奇数

谢谢大家的帮助!

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

  1. 您在这里使用where作为过滤器,但是在Haskell a中,该子句用于定义本地范围的变量;
  2. 您仅定义(x:xs)模式,因此即使有效,它也会在空列表上误差;
  3. [x | x <- xs]只是列表的身份函数,因此我们可以忽略,此外,建议 not> not 命名变量与"外部"变量相同,因为这会引起混乱;和
  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作为CC_8作为这些元素执行映射获取元素并返回该元素的映射的函数。

您有一些问题。一个是不正确的语法,另一个是误解了该子句的目的。然后是不必要地匹配的模式。最后,并不是严格的问题,是列表符号和高阶功能的混合。

不是一个子句

a where子句用于可变绑定,例如:

where functionName param1 param2 = <some expression>

该子句对于对变量的约束并不有用。对于列表通知样式约束,只需添加逗号和约束:

[x | x <- list, predicate1 x, predicate2 x]

模式匹配

该功能cubeOdds2 (x:xs)将将x绑定到列表中的第一个元素,然后将xs绑定到其余列表。在空列表上例外也将失败。 您似乎想要的只是在列表上操作,所以不要模式匹配,而只使用诸如cubeOdds2 xs的变量名称。

列表理解符号与高阶功能

列表理解是语法,例如[a | val <- list, predicate val, let a = someFunction val]。高阶函数可以完成列表理解所做的一切,例如map ping基于谓词。

一些解决方案

随着这些更改,我们为您的CubeODDS功能提供了三种最终形式。

首先,您的约定:

cubeOdds3 xs = map cube [x | x <- xs, x `mod` 2 == 1]

第二,只需列表理解:

cubeOdds4 xs = [cube x | x <- xs, x `mod` 2 == 1]

第三,只是高阶功能:

cubeOdds5 xs = map cube (filter (x -> x `mod` 2 == 1) xs)

代码高尔夫

我们甚至可以进一步使用内置的odd功能:

cubeOdds6 xs = [cube x | x <- xs, odd x]

也使用免费点样式:

cubeOdds7 = map cube . filter odd

相关内容

最新更新