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
并不意味着 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
和 b
和 c
在这里是相同的类型。 foldr (-)
的类型因此具有类型:foldr (-) :: Num c => c -> ([c] -> c)
foldr (-)
因此采用多个 c
类型,并返回一个将 c
列表映射到 c
的函数。关于haskell - 理解foldr的定义,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/57400148/