cube = x*x*x
cube xs = map cube [x | x <-xs]
where x mod 2 == 1
所以我正在尝试获取列表的奇数
谢谢大家的帮助!
上面的代码片段包含一些错误:
- 您在这里使用
where
作为过滤器,但是在Haskell a中,该子句用于定义本地范围的变量; - 您仅定义
(x:xs)
模式,因此即使有效,它也会在空列表上误差; -
[x | x <- xs]
只是列表的身份函数,因此我们可以忽略,此外,建议 not> not 命名变量与"外部"变量相同,因为这会引起混乱;和 -
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