haskell中的文件夹映射是什么类型?

时间:2018-09-11 14:44:05

标签: haskell

我正在尝试找出文件夹映射的类型,以及如何解决此类问题。

我知道每种类型是什么

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

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

foldr会将函数作为第一个参数,这将是整个地图的正确选择?

欢迎所有提示,我是Haskell的新手,正在尝试学习此类难题。

1 个答案:

答案 0 :(得分:9)

我们有foldrmap作为配料。为了避免混淆,让我们将a的{​​{1}}和b重命名为mapc,因为它们(可能)是不同的类型。因此,我们将其作为函数:

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 -> db[c]相同的类型。因此,我们也知道[d]c ~ dc是同一类型)。

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,但派生类型相似。