2015-04-15 59 views
4

我承认这个问题有点不明确,但我想知道为什么我从来没有偶然发现过Haskell中函子monique的类型类。我是否错过了它,这种缺席是否有充分理由,还是完全是由于历史原因?恕我直言,下面的继承图看起来有点古怪没有右上角:“这是什么从Functor箭头的真正含义是”为什么Haskell中没有用于函数的monoids类型?

Functor 
    | 
    V 
Applicative ––> Alternative 
    |    | 
    V    V 
    Monad ––> MonadPlus 
+0

你可以随时添加它(如果可以合理定义的话,可能还会有一些CT库) - 我的最佳猜想:那里只有没有/没有足够的用例 – Carsten

+0

我不同意你总是可以添加它,因为你不能使它成为Alternative的超类。我也认为(几乎)Alternative/MonadPlus的每个用例实际上都是这个缺失类的用例。但也许我在这里有点过于理想化。 –

+4

“Monoid”课程是不是已经涵盖了这个?你能详细说明一下你认为这个班级应该超出'Monoid'已经提供的那些方法吗? –

回答

7

一个值得考虑的关键因素是,如果没有公理统一FunctorFunctorPlus那么你可能只是定义instance Monoid (F t) where ...并与它做。那么你在寻找什么公理 - 只是fmap f fempty = fempty或者fmap f x <|> fmap f y == fmap f (x <|> y) ......?

另一个关键因素是缺乏有趣的结构,它是仿函数而不是应用。可能有一个争论与泛型编程有关(元编程deriving关键字),其中所有东西都是产品的总和,因此我们可以从* -> *得到Applicative,但我不知道细节。唯一的价值FunctorPlus可能是“做同样的事情,替代方案不适用于Functors”,所以如果这个集合非常小,那么显然没有太多附加值。

+4

我不同意你的前提,即不适用的仿函数不相关。即使应用实例是_possible_,它通常既不明显也不真正有用。而一个'Functor'实例总是规范的 - 如果可能的话,那么它的行为就不会有歧义,实例可以通过'-XDeriveFunctor'实例自动添加。 – leftaroundabout

+0

@leftroundabout我同意你的不同意见。从“这里有一些原因可能还没有完成”这个意义上来说,这是一个答案,不是,“这就是为什么它不能/不应该完成”,所以我只是说“你可以通常使用幺半群,通常情况下函数是可应用的。“ –

+0

我很想说我想选择这样的公理,这样'FunctorPlus'就像'Alternative'添加到'Applicative'一样为'Functor'增加了很多。无论这意味着什么。但我刚刚注意到'Alternative'只不过是一个'Monoid'。所以,也许我应该要求在'Applicative' +'Monoid'上实际使用'Alternative'。无论如何,再次考虑我的用例,让我意识到“FunctorPlus”对它没有任何帮助。 –

相关问题