为什么Haskell中的仿函数上的monoids没有类型类?

Mar*_*ett 4 haskell functional-programming functor typeclass monoids

我承认这个问题有点不明确,但我想知道为什么我从来没有偶然发现Haskell中的仿函数上的monoids类型类.我是否错过了它,是否有充分的理由要求这种缺席,还是完全归因于历史原因?恕我直言,下面的继承图表看起来有点奇怪没有右上角:

  Functor
     |
     V
Applicative ––> Alternative
     |               |
     V               V
   Monad    ––>  MonadPlus
Run Code Online (Sandbox Code Playgroud)

CR *_*ost 7

这里要考虑的一个关键因素是,"箭头Functor究竟是什么意思?" 如果没有公理是统一Functor使用FunctorPlus,那么你可能也只是定义instance Monoid (F t) where ...,并用它来完成.那么你在寻找什么样的公理 - 只是fmap f fempty = fempty或者fmap f x <|> fmap f y == fmap f (x <|> y)......?

另一个关键因素是缺乏有趣的结构,这些结构是仿函数而不是应用程序.可能有一个论点与泛型编程(元编程deriving关键字)有关,其中所有东西都是产品的总和,因此我们可以推导出Applicative任何类型* -> *,但我不知道细节.唯一的值FunctorPlus可能是"做一个替代品对不适用的Functors做同样的事情",所以如果那个集合真的很小,那么显然没有太多的附加值.

  • 我不同意你的前提,即非适用的仿函数不相关.即使一个应用实例是_possible_,它通常既不明显也不实用.而Functor`实例总是规范的 - 如果它可能的话,那么它的行为就不会有歧义,并且实例可以通过`-XDeriveFunctor`实例自动添加. (4认同)