我正在学习一些Haskell而我无法理解。我有这个表达:
flip foldr id
我需要找到它的类型。经过很长一段时间试图解决这个问题,我放弃了,并查找了正确的答案,即:
(a -> (a1 -> a1) -> a1 -> a1) -> [a] -> a1 -> a1
但我不明白为什么,我想!
我想[a] -> a1 -> a1
来自foldr
表达式,但我不知道如何继续。
谢谢你,对不起我的英文!
答案 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
。查看flip
和foldr
的类型,我们发现a1 -> b1 -> c1
类型中的flip
类型与foldr
的类型“匹配” 。这意味着a1
与a -> b -> b
匹配,b1
与b
匹配,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
)。这意味着b
与a2 -> 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
并删除一些括号,那么这与您得到的答案相同。