Haskell表达式?

时间:2014-05-08 22:54:29

标签: haskell

我正在学习一些Haskell而我无法理解。我有这个表达:

flip foldr id

我需要找到它的类型。经过很长一段时间试图解决这个问题,我放弃了,并查找了正确的答案,即:

(a -> (a1 -> a1) -> a1 -> a1) -> [a] -> a1 -> a1

但我不明白为什么,我想! 我想[a] -> a1 -> a1来自foldr表达式,但我不知道如何继续。 谢谢你,对不起我的英文!

1 个答案:

答案 0 :(得分:6)

检查所涉及的各个功能的类型:

λ :t id
id :: a -> a
λ :t foldr
foldr :: (a -> b -> b) -> b -> [a] -> b
λ :t flip
flip :: (a -> b -> c) -> b -> a -> c

然后尝试考虑将这些函数相互应用以查看类型如何匹配。

为避免在思考时出现名称冲突,我们可以将flip的类型重写为(a1 -> b1 -> c1) -> b1 -> a1 -> c1

首先发生的事情是将flip应用于foldr。查看flipfoldr的类型,我们发现a1 -> b1 -> c1类型中的flip类型与foldr的类型“匹配” 。这意味着a1a -> b -> b匹配,b1b匹配,c1[a] -> b匹配。

因此,在此背景下,flip的类型变为((a -> b -> b) -> b -> [a] -> b) -> b -> (a -> b -> b) -> [a] -> b(我只是将每个a1替换为a -> b -> c,每个b1替换为b 1}},每个c1[a] -> b),flip foldr的类型与第一个参数被删除是相同的:b -> (a -> b -> b) -> [a] -> b

到目前为止,我们可以使用ghci检查我们的工作:

λ :t flip foldr
flip foldr :: b -> (a -> b -> b) -> [a] -> b

现在我们采用此类型并将其应用于id类型(我们将其写为a2 -> a2)。这意味着ba2 -> a2匹配,flip foldr的类型变为(a2 -> a2) -> (a -> (a2 -> a2) -> (a2 -> a2)) -> [a] -> (a2 -> a2)flip foldr id的类型与第一个参数相同离开:(a -> (a2 -> a2) -> (a2 -> a2)) -> [a] -> a2 -> a2。如果我们只是将a2重写为a1并删除一些括号,那么这与您得到的答案相同。