http://haskellbook.com中的一个练习是为
编写一个仿函数实例data EvilGoateeConst a b =
GoatyConst b
我的尝试是
instance Functor (EvilGoateeConst a) where
fmap f (GoatyConst b) = GoatyConst b
最简单的解决方法是将参数切换到类型构造函数,但我想这是禁止的。在不改变原始类型的情况下解决此问题的最简单方法是什么?
(我没有应用这个函数,因为这会使编译器成为barf,但我认为根据法律它仍然是一个有效的函子。)
答案 0 :(得分:5)
我认为你过度思考这个问题 - 在这种情况下应该看fmap
的类型:
fmap :: (b -> c) -> EvilGoateeConst a b -> EvilGoateeConst a c
原因是EvilGoateeConst a b ~ (EvilGoateeConst a) b
所以EvilGoateeConst a :: * -> *
完全符合Functor
实例需要的种类,但现在a
是< strong>已修复,仿函数可能会更改b
而不是
好吧,我不知道如何在不完全破坏的情况下说出更多内容,所以不要看看你是否想亲自尝试,但答案只是:
instance Functor (EvilGoateeConst a) where
fmap f (GoatyConst b) = GoatyConst (f b)