作者:望尽天涯 | 来源:互联网 | 2022-10-16 15:43
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)
吗?
1> Willem Van O..:
函数签名是a -> b -> b
事实并不意味着a
并且b
应该是不同的类型。它意味着a
并且b
可以是不同的类型。
例如(-) :: Num c => c -> c -> c
,如果您使用,则Haskell将得出以下结论:
foldr :: (a -> b -> b) -> (b -> ([a] -> b))
(-) Num c => c -> c -> c
----------------------------------------------------
a ~ c, b ~ c
因此,a
and b
和c
因此在这里是同一类型。的类型的foldr (-)
因此具有类型:
foldr (-) :: Num c => c -> ([c] -> c)
foldr (-)
因此需要一个类型的数字c
,并返回一个将c
s 列表映射到a 的函数c
。