问题描述
我有以下类型 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 中启用了 derive functor extension 时才有效(对于 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
这个 Functor
似乎没有处理 Summish a b
的所有可能值。