如何为第一个参数幻影的幻影类型创建仿函数实例?

How to create functor instance for phantom type where first argument phantom?

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

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

我的尝试是

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

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

(而且我没有应用该函数,因为这会使编译器感到厌烦,但我认为根据法律,它仍然是一个有效的函子。)

我认为你 想多了 这个问题 - 查看 fmap 的类型,在这种情况下应该是:

fmap :: (b -> c) -> EvilGoateeConst a b -> EvilGoateeConst a c

原因是 EvilGoateeConst a b ~ (EvilGoateeConst a) b 所以 EvilGoateeConst a :: * -> * 正好符合 种类 Functor 实例需要,但现在 a 固定的 并且仿函数可能会更改 b 而不是


好吧,我不知道如何在不完全破坏它的情况下说更多,所以如果您想自己尝试,请不要看,但答案只是:

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