如何为幻像类型创建functor实例,其中第一个参数幻像?

时间:2016-03-11 18:06:48

标签: haskell functor

http://haskellbook.com中的一个练习是为

编写一个仿函数实例
data EvilGoateeConst a b =
  GoatyConst b

我的尝试是

instance Functor (EvilGoateeConst a) where
  fmap f (GoatyConst b) = GoatyConst b

最简单的解决方法是将参数切换到类型构造函数,但我想这是禁止的。在不改变原始类型的情况下解决此问题的最简单方法是什么?

(我没有应用这个函数,因为这会使编译器成为barf,但我认为根据法律它仍然是一个有效的函子。)

1 个答案:

答案 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)