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
Run Code Online (Sandbox Code Playgroud)
这意味着第一个参数是类型(a -> b -> b),第二个b,第三个参数[a]返回b。
如果我们看一个例子:
foldr (-) 54 [10, 11]
Run Code Online (Sandbox Code Playgroud)
是否不-接受两个相同类型的对象,并返回相同类型的对象?那不是(a -> a -> a)吗?
函数签名是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
Run Code Online (Sandbox Code Playgroud)
因此,aand b和c因此在这里是同一类型。的类型的foldr (-)因此具有类型:
foldr (-) :: Num c => c -> ([c] -> c)
Run Code Online (Sandbox Code Playgroud)
foldr (-)因此需要一个类型的数字c,并返回一个将cs 列表映射到a 的函数c。