所以我不太确定如何正确表达这一点,但是说我想得到一个列表中所有奇数的总和,我有两个函数(sumList 和 getOddNumbers)并将它们组合成 sumOddList 还是存在一种将这两者放在一个函数中的方法?如果没有更好的功能,我将如何将它们组合成 sumOddList?
getOddNumbers :: [Integer] -> [Integer]
getOddNumbers [] = []
getOddNumbers (x:xs)
|odd x = x:getOddNumbers xs
|otherwise = getOddNumbers xs
sumList :: [Integer] -> Integer
sumList list = case list of
[] -> 0
(x:xs) -> x + (sumList xs)
我还问主要是因为将两个 diff 函数放在一起是我以前在使用 CodeWorld 放置颜色和形状以输出该颜色的形状时遇到的问题。
谢谢
(注意:我使用 Haskell 已经超过 5 周了,显然我完全是个菜鸟)
最佳答案
将输出作为输入传递给(另一个)函数
你基本上想要做的是使用 getOddNumbers
的输出作为sumList
的输入函数,所以我们可以定义一个 sumOddList
作用为:
sumOddList :: [Integer] -> Integer
sumOddList l = sumList (getOddNumbers l)
这里 l
是我们要处理的列表,因此结果是对 getOddNumbers l
结果的函数应用(使用 sumList
函数)。
链接函数:(.)
功能
上述模式很常见:我们经常希望首先通过函数 g
传递数据, 以及通过函数 f
得到的结果. Haskell 有 (.) :: (b -> c) -> (a -> b) -> a -> c
函数“链接”函数。因此,我们可以链接 sumList
和 getOddNumbers
一起喜欢:
sumOddList :: [Integer] -> Integer
sumOddList = (.) sumList getOddNumbers
请注意,我们不再使用 l
参数在这里。 sumOddList
在这里定义为“管道”,其中数据首先传递到 getOddNumbers
,然后由sumList
“后处理”功能。
(.)
函数也可以用作中缀运算符:
sumOddList :: [Integer] -> Integer
sumOddList = sumList . getOddNumbers
关于list - 在haskell的新函数中使用过滤列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52034032/