haskell中的foldr地图是什么类型的?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了haskell中的foldr地图是什么类型的?相关的知识,希望对你有一定的参考价值。

我试图找出折叠地图的类型,以及你应该如何解决这样的问题。

我知道个别类型是什么:

foldr :: (a -> b -> b) -> b -> [a] -> b
map :: (a -> b) -> [a] -> [b]

我知道各个函数是如何工作的,但找出类型是我似乎无法解决的问题。

foldr会将一个函数作为第一个参数,这将是整个映射的权利吗?

我欢迎所有提示,我是Haskell的新手,并试图学习这些谜题。

答案

作为成分,我们有foldrmap。为了避免混淆,让我们将abmap重命名为cd,因为这些(可能)是不同的类型。所以我们把功能看作:

foldr :: (a -> b -> b) -> b -> [a] -> b
map   :: (c -> d) -> [c] -> [d]

或者更详细:

foldr :: (a -> (b -> b)) -> (b -> ([a] -> b))
map   :: (c -> d) -> ([c] -> [d])

由于map是以foldr为函数的函数应用程序的参数,这意味着map的类型应该与foldr的参数类型相同,因此:

  a        -> (b   -> b)
~ (c -> d) -> ([c] -> [d])
----------------------------------
a ~ (c -> d), b ~ [c] ~ [d], c ~ d

因此我们得出ac -> d的类型相同,而b[c][d]的类型相同。因此我们也知道c ~ dcd的类型相同)。

foldr map的类型是foldr函数的返回类型,但是专门用于我们得到的相等关系,因此:

foldr map :: b -> ([a] -> b)

所以我们用a替换c -> c,用b替换[c],因此类型:

foldr map :: [c] -> ([c -> c] -> [c])

或者是一种不那么冗长的形式:

foldr map :: [c] -> [c -> c] -> [c]

注意:foldr的签名已经推广到foldr :: Foldable f => (a -> b -> b) -> b -> f a -> b,但派生类型是相似的。

以上是关于haskell中的foldr地图是什么类型的?的主要内容,如果未能解决你的问题,请参考以下文章

有4个参数的foldr?

如何对迭代中类型发生变化但函数形式相同的函数进行“迭代”

[Haskell] 为什么列表操作++很昂贵?

Haskell - 列表的立方体总和

Haskell:FRP 反应性 Parsec?

Haskell 类型声明中的符号 `!` 是啥意思?