了解文件夹的定义

use*_*875 3 haskell

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)吗?

Wil*_*sem 7

函数签名是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 bc因此在这里是同一类型。的类型的foldr (-)因此具有类型:

foldr (-) :: Num c => c -> ([c] -> c)
Run Code Online (Sandbox Code Playgroud)

foldr (-)因此需要一个类型的数字c,并返回一个将cs 列表映射到a 的函数c