如何解决如何编写 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
的所有可能值。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。