繁体   English   中英

为什么Functor不公开fmap的默认实现?

[英]Why does Functor not expose a default implementation of fmap?

Functor类的类型定义中:

class Functor f where
    fmap :: (a -> b) -> f a -> f b

为什么fmap没有默认实现? 像这样的东西:

class Functor f where
    fmap :: (a -> b) -> f a -> f b
    fmap fn (f a) = (f $ (fn) a)

当我编写Functor实例时,我手动为每个实例编写相同的代码。 有没有办法指定默认实现?

你可能想要这个:

{-# LANGUAGE DeriveFunctor #-}

data T1 a = T1 a
  deriving Functor
data T2 a = T2 a
  deriving Functor

至于为什么没有针对仿函数的默认实现:只有f是身份仿函数(直到同构),你的提议才有效。 也就是说,它可以工作

data F a = F a

但它不会起作用

data F a = F a a

要么

data F a = F (Int -> a) [a] (Maybe a)

这需要更复杂的fmap

虽然无法编写适用于所有情况的默认fmap ,但在许多简单的情况下(例如上述情况),发现fmap应该是什么似乎微不足道。 幸运的是,我们现在derive Functor ,它涵盖了这些简单的案例。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM