我正在尝试手动导出 ((.) foldr) 的类型
(.) ::(b1 -> c1) -> (a1 -> b1) -> a1 -> c1
foldr :: (a2 -> b2 -> b2) -> b2 -> [a2] -> b2
然后:
b1 = a2 -> b2 -> b2
c1 = b2 -> [a2] -> b2
匹配我得到的类型:
((a2 -> b2 -> b2) -> (b2 -> [a2] -> b2)) -> (a1 -> (a2 -> b2 -> b2)) -> a1 -> (b2 -> [a2] -> b2)
但后来我对如何减少这种表达感到困惑。
有什么帮助吗?
谢谢,
塞巴斯蒂安。
最佳答案
您正确地计算出了 (.) foldr
中 (.)
的类型。 (.)
应用于一个参数(foldr
),因此您可以丢弃 ((a2 -> b2 -> b2) -> (b2 -> [a2] -> b2))
剩下的就是 (.) foldr
的类型:
(a1 -> a2 -> b2 -> b2) -> a1 -> (b2 -> [a2] -> b2)
确保 foldr
可以在你之前输入 ((a2 -> b2 -> b2) -> (b2 -> [a2] -> b2))
把它扔掉。如果匹配正确,此检查不会失败,但它是一个很好的完整性检查。
关于haskell - 导出 ((.) foldr) 的类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23415155/