如何编写Functor实例



我有以下类型的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的所有可能值。

最新更新