haskell中的foldr地图是什么类型的?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了haskell中的foldr地图是什么类型的?相关的知识,希望对你有一定的参考价值。
我试图找出折叠地图的类型,以及你应该如何解决这样的问题。
我知道个别类型是什么:
foldr :: (a -> b -> b) -> b -> [a] -> b
map :: (a -> b) -> [a] -> [b]
我知道各个函数是如何工作的,但找出类型是我似乎无法解决的问题。
foldr会将一个函数作为第一个参数,这将是整个映射的权利吗?
我欢迎所有提示,我是Haskell的新手,并试图学习这些谜题。
答案
作为成分,我们有foldr
和map
。为了避免混淆,让我们将a
的b
和map
重命名为c
和d
,因为这些(可能)是不同的类型。所以我们把功能看作:
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
因此我们得出a
与c -> d
的类型相同,而b
与[c]
和[d]
的类型相同。因此我们也知道c ~ d
(c
与d
的类型相同)。
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地图是什么类型的?的主要内容,如果未能解决你的问题,请参考以下文章