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

The*_*Cat 0 haskell functor

http://haskellbook.com中的一个练习是编写一个函子实例

data EvilGoateeConst a b =
  GoatyConst b
Run Code Online (Sandbox Code Playgroud)

我的尝试是

instance Functor (EvilGoateeConst a) where
  fmap f (GoatyConst b) = GoatyConst b
Run Code Online (Sandbox Code Playgroud)

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

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

Car*_*ten 5

我认为你正在推翻这个问题 - 看看fmap这种情况应该是:

fmap :: (b -> c) -> EvilGoateeConst a b -> EvilGoateeConst a c
Run Code Online (Sandbox Code Playgroud)

其原因是,EvilGoateeConst a b ~ (EvilGoateeConst a) bEvilGoateeConst a :: * -> *完全适合的那种一个Functor实例需要有,但现在a固定的和仿函数可能会改变b,而不是


好吧我不知道怎么说更多没有完全破坏它所以不要看你是否想自己尝试但答案只是:

instance Functor (EvilGoateeConst a) where
  fmap f (GoatyConst b) = GoatyConst (f b)
Run Code Online (Sandbox Code Playgroud)