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 -> b -> b 并不意味着 ab 应该是不同的类型。这意味着 ab 可以是不同的类型。

例如,如果您使用 (-) :: Num c => c -> c -> c ,那么 Haskell 会推断出:

foldr ::          (a -> b -> b) -> (b -> ([a] -> b))
(-)      Num c =>  c -> c -> c
----------------------------------------------------
a ~ c, b ~ c

所以 abc 在这里是相同的类型。 foldr (-) 的类型因此具有类型:
foldr (-) :: Num c => c -> ([c] -> c)
foldr (-) 因此采用多个 c 类型,并返回一个将 c 列表映射到 c 的函数。

关于haskell - 理解foldr的定义,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/57400148/

10-12 20:46