list - 在haskell的新函数中使用过滤列表

标签 list function haskell recursion 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)

我还问主要是因为将两个 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 函数“链接”函数。因此,我们可以链接 sumListgetOddNumbers一起喜欢:

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/

相关文章:

java - 如何返回两个列表之间的差异?

html - 将有序列表设置为 "1.1, 1.2"而不是 "1, 2"

python - 在函数内部定义全局

haskell - Haskell 中带有 `Ord` 参数的 Memoize 函数

haskell - 如何终止在 `IO` monad 中运行的计算?

Haskell 和 Vim : Proper Indentation

python - 删除以相同子字符串开头的第二个项目

java - 如何使用流从两个列表或数组乘法中查找元素对

我可以在不为其中一个参数指定类型的情况下声明一个函数吗?

php - json_encode 在处理多字节子字符串时返回 false