我有以下类型的data Summish a b = First a | Second b
。
如何为它编写Functor实例?
我试过
instance Functor (Summish a) where
fmap f (Second a) = Second (f a)
最简单的方法是让编译器为您执行(派生(:
{-# LANGUAGE DeriveFunctor #-}
data Summish a b
= First a
| Second b
deriving Functor
只有在GHC中启用了派生函子扩展时,这才有效(对于GHCi,请使用:set -XDeriveFunctor
(。
所以我想你想要/需要手动导出它。
正如其他人所说,您只需要First
的情况就可以使其详尽无遗:
data Summish a b
= First a
| Second b
instance Functor (Summish a) where
fmap f (First b) = First b
fmap f (Second a) = Second (f a)
这就是编写Functor
实例的方法。
问题是,这是一个完全合法的例子吗?
如果您将deriving Show
添加到数据类型中,并尝试使用以下实例:
> fmap (+ 1) (Second 2)
Second 3
> fmap (+ 1) (First 2)
*** Exception: ...: Non-exhaustive patterns in function fmap
该CCD_ 6似乎没有处理CCD_ 7的所有可能值。