第 995 页上的“Haskell Programming from First Principles”的第 16 章有一个练习来手动计算类型检查的方式(fmap . fmap)
。它建议将每个类型的类型替换fmap
为组合运算符类型中的函数类型:
T1(.) :: (b -> c) -> (a -> b) -> a -> c
T2fmap :: Functor f => (m -> n) -> f m -> f n
T3fmap :: Functor g => (x -> y) -> g x -> g y
通过(尝试)将 T2 和 T3 代入 T1,我得出以下结论:
T4:((m -> n) -> f m -> f n) -> ((x -> y) -> g x -> g y) -> a -> c
此外,它建议检查类型(fmap . fmap)
以查看最终类型应该是什么样子。
T5:(fmap . fmap) :: (Functor f1, Functor f2) => (a -> b) -> f1 (f2 a) -> f1 (f2 b)
我无法理解我应该在这里做什么。任何知识渊博的haskellers可以帮助我开始,或者提供类似练习的例子来展示如何手工计算类型?