2010-11-18 3 views
5

Ich habe LYAH gelesen. Er sagt, ich brauche ausdrücklich Control.Monad.Instances zu laden die folgende Syntax, um zu arbeiten:Warum ist (->) nicht standardmäßig mit Control.Monad.Instances implementiert

((fmap (+5)) (+5)) 4 

Warum das so ist? Warum, wenn Funktoren diese zugrunde liegende und vereinheitlichende Technologie sind, muss ich Control.Monad.Instances explizit laden, um diese Funktionalität zu erhalten. Wie wird (->) ohne es umgesetzt (oder wird nur versteckt und nur -> exportiert)? Warum ist die Verwendung von fmap über Funktionstypen nicht standardmäßig implementiert?

+0

Siehe auch http://stackoverflow.com/questions/4204086/is-the-monad-w-instance-anywhere-standard –

Antwort

10

Hier sind 3 verschiedene Konzepte beteiligt. Der Funktionstyp, die Funktor-Typklasse und die Functor-Instanz. Der Funktionstyp, (->), ist in die Sprache integriert, und seine Existenz und Implementierung sind völlig unabhängig von Functor und fmap. Die Typklasse ist die Spezifikation der Signatur ihrer zugeordneten Methoden. Die "Instanz" ist eine Implementierung dieser Signatur.

Um Ihre Frage klarer zu formulieren, würde ich das als "Warum ist nicht die Functor-Instanz für (->) im Prelude?" (Das Vorspiel ist das Modul, das standardmäßig im Umfang ist). Wie es derzeit formuliert ist, macht es nicht viel Sinn.

Die Antwort auf die modifizierte Frage ist einfach: Der Haskell Report (die offizielle Sprachspezifikation, wo die Schnittstelle des Preludes angegeben ist) enthält sie nicht. Wohl sollte es, aber die Haskell-Sprache und Bibliotheken haben sich seitdem viel entwickelt, und Haskell-Standards neigen dazu, sich langsam zu ändern. In jedem Fall, richtig oder falsch, deshalb.

2

Functor ist keine Sprachfunktion, es ist nur eine nützliche Klasse, die ein zufälliges Modul definiert. Um die Functor-Definition dieses Moduls zu verwenden, müssen Sie es laden, Ende der Geschichte.