我正在尝试找出文件夹映射的类型,以及如何解决此类问题。
我知道每种类型是什么
foldr :: (a -> b -> b) -> b -> [a] -> b
map :: (a -> b) -> [a] -> [b]
我知道各个函数的工作方式,但是找出类型是我似乎无法解决的。
foldr会将函数作为第一个参数,这将是整个地图的正确选择?
欢迎所有提示,我是Haskell的新手,正在尝试学习此类难题。
答案 0 :(得分:9)
我们有foldr
和map
作为配料。为了避免混淆,让我们将a
的{{1}}和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
的类型应该与 parameter < / em>中的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
函数的 return 类型,但是专门处理我们已经得出的相等关系,因此:
foldr
因此我们将foldr map :: b -> ([a] -> b)
替换为a
,并将c -> c
替换为b
,因此类型为:
[c]
或以不太冗长的形式:
foldr map :: [c] -> ([c -> c] -> [c])
注意:
foldr map :: [c] -> [c -> c] -> [c]
的签名已被普遍化为foldr
,但派生类型相似。