在haskell中的新函数中使用筛选列表

CB0*_*101 4 recursion haskell function list composition

所以我不太确定如何正确地说这个,但是我想要得到列表中所有奇数的总和,我有两个函数(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)
Run Code Online (Sandbox Code Playgroud)

我还要问主要是因为将两个差异函数放在一起是我之前努力解决的问题,当使用CodeWorld输出颜色和形状来输出该颜色的形状时.

谢谢

(注意:我现在已经使用Haskell超过5周了,而且我显然是一个总菜刀)

Wil*_*sem 5

将输出作为输入传递给(另一个)函数

那么你基本上想要做什么是使用输出的的getOddNumbers作为输入sumList功能,所以我们可以定义一个sumOddList函数为:

sumOddList :: [Integer] -> Integer
sumOddList l = sumList (getOddNumbers l)
Run Code Online (Sandbox Code Playgroud)

l是我们要处理的列表,因此结果是getOddNumbers l(带有sumList函数)结果的函数应用程序.

链接功能:(.)功能

上面的模式很常见:我们经常想先通过函数传递数据g,然后通过函数传递结果f.Haskell具有(.) :: (b -> c) -> (a -> b) -> a -> c"链接"功能的功能.因此sumList,我们可以getOddNumbers像以下一样链接

sumOddList :: [Integer] -> Integer
sumOddList = (.) sumList getOddNumbers
Run Code Online (Sandbox Code Playgroud)

请注意,我们不再l在此处使用参数.sumOddList这里定义为"管道",其中数据首先传递给getOddNumbers,然后由sumList函数"后处理" .

(.)函数也可以用作中缀运算符:

sumOddList :: [Integer] -> Integer
sumOddList = sumList . getOddNumbers
Run Code Online (Sandbox Code Playgroud)