所以我不太确定如何正确表达这一点,但是假设我想获得列表中所有奇数的总和,我是否有两个函数(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)
我问这个问题主要是因为我之前在使用 CodeWorld 放置颜色和形状以输出该颜色的形状时遇到过将两个 diff 函数放在一起的问题。
谢谢
(注:我现在使用 Haskell 才 5 周多,显然我是个菜鸟)
将输出作为输入传递给(另一个)函数
那么你基本上想做的是use the output of the getOddNumbers
as input为了sumList
函数,所以我们可以定义一个sumOddList
功能为:
sumOddList :: [Integer] -> Integer
sumOddList l = sumList (getOddNumbers l)
Here l
是我们要处理的列表,因此结果是对结果的函数应用getOddNumbers l
(with sumList
功能)。
链接函数:(.)
功能
上面的模式很常见:我们经常希望首先通过函数传递数据g
,以及通过函数得到的结果f
。哈斯克尔有(.) :: (b -> c) -> (a -> b) -> a -> c函数“链接”函数。我们可以这样链接sumList
and getOddNumbers
一起像:
sumOddList :: [Integer] -> Integer
sumOddList = (.) sumList getOddNumbers
请注意,我们不再使用l
参数在这里。sumOddList
这里定义为“管道”,其中数据首先传递到getOddNumbers
,然后由sumList
功能。
The (.)
函数也可以用作中缀运算符:
sumOddList :: [Integer] -> Integer
sumOddList = sumList . getOddNumbers
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)