微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何编写 Functor 实例

如何解决如何编写 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 举报,一经查实,本站将立刻删除。