2015-02-21 6 views
9

Sum definiert in der Basis 4.7.0.2 hat keine Functor Instanz. Warum?Warum Summe und Produkt sind keine Funktoren

Zum Beispiel haben die in semigroups definierten Pakete Functor, Applicative und Monad auf z.B. Min, die sich wieIdentity verhalten - macht für mich Sinn.

Antwort

7

Ich glaube der Hauptgrund, dass diese nicht Functor Instanzen sind, ist, dass Sie noch keinen Code-Review eingereicht haben, um sie so zu machen. Sie können ein Ticket unter Trac einreichen und dann einen Code-Review unter Phabricator einreichen. Der bevorzugte Workflow von Phabricator (mit Arcanist) sowie weitere Details finden Sie unter here.

Während Sie das tun, sollten Sie wahrscheinlich auch Instanzen von Applicative und Monad. Sie sollten auch Foldable und Traversable Instanzen für sie in Data.Foldable bzw. Data.Traversable hinzufügen.

Wenn Sie wollen, dass ich erraten, warum niemand sonst tat dies:

Während Sum und Product Dinge jeglicher Art halten kann, die Monoid Instanzen nur Sinn für Num Instanzen machen. Der Typ von fmap fühlt sich daher etwas merkwürdig allgemein an. Dies ist jedoch kein wirklich guter Grund, sie nicht zu Functor Instanzen zu machen.

+1

Mein Anwendungsfall für 'Functor' ist z.B. 'fromIntegral <$> s'. Und ich denke, etwas in 'base' zu ändern bedeutet nicht nur, einen Patch zu senden: https://wiki.haskell.org/Library_submissions – phadej

+1

@phadej, was ich sagen wollte ist, dass du recht hast; Sie müssen die Bibliotheksliste per E-Mail senden. Aber es ist fast sicher, dass es genehmigt wird. Es gibt eine allgemeine Ansicht, dass, wenn es genau eine vernünftige Möglichkeit gibt, einen Typ zu einer Instanz einer Klasse zu machen, dies am Definitionspunkt erfolgen sollte, um Waisen zu vermeiden. – dfeuer

+0

Ich wette, das ist Absicht. Es geht irgendwie gegen den Geist von 'Functor', wenn es nur Sinn macht, mit einer 'Num'-Instanz innerhalb zu enden, und es gibt keine Möglichkeit, diese Beschränkung mit der'Functor'-Typklasse auszudrücken, zu der' base' gehört. –