如何编写 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 中启用了 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 的所有可能值。