如何为第一个参数幻影的幻影类型创建仿函数实例?
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)
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)