【发布时间】:2019-08-07 18:14:15
【问题描述】:
foldr的定义是(根据https://hackage.haskell.org/package/base-4.12.0.0/docs/src/GHC.Base.html#local-6989586621679020249)
foldr :: (a -> b -> b) -> b -> [a] -> b
这意味着第一个参数的类型是(a -> b -> b),第二个是b,第三个是[a],并返回b。
如果我们看一个例子:
foldr (-) 54 [10, 11]
- 不接受两个相同类型,并返回相同类型吗?所以不应该是(a -> a -> a)吗?
【问题讨论】:
-
a -> a -> a是a -> b -> b的“特定”案例。 -
@WillemVanOnsem
-有时可以减去两种不同的类型吗?它不能用一个列表减去一个整数吗? -
不,
(-)函数在Num类型类中定义为Num a => a -> a -> a。您可以使用fromIntegral之类的函数将一种数字类型转换为另一种类型。 -
注意
(-)的类型限制了foldr的结果类型:foldr :: (a -> b -> b) -> b -> [a] -> b,但是foldr (-) :: Num a => a -> [a] -> a,而不是b -> [a] -> b。 -
也许只是
a和b是不同类型的示例:let f = foldr (\x y-> if (fst x > 0) then y else (y + snd x)) 0处理元组列表并返回第一个参数大于零的所有第二个参数的总和。例如。f [(1,2), ((-1),4), (3,2)] = 4.
标签: haskell