Änderung von Haskells Functor für die Metaprogrammierung

8

Meine Kenntnisse der Kategorientheorie sind nicht sehr gut. Also bitte bitte mit mir.

Ich habe Monaden

gelesen

und sah die folgende Definition.

%Vor%

Von dieser Seite habe ich gelesen, dass der Funktor-Typ in Haskells Vorspiel wirklich ein Endofunker ist. (wobei sowohl Kategorie c als auch d in der obigen Klasse Hask sind)

Nachdem ich die Seite durchgelesen habe, habe ich mich gefragt. Wäre Haskell für Meta-Programmierung besser geeignet, wenn es echte Funktoren und nicht nur Endofunktoren verwendet?

sagen wir haben folgendes (die Js steht für Javascript)

%Vor%

zurück zur Definition von Functor oben

%Vor%

wir können cs JsFunc haben, d sei Hask und muss js

sein

Das wird uns einen Functor für Js geben. Das konnte ich nicht mit Haskells Endofunker machen.

Ich konnte nichts für die Klassen Apply oder Applicative finden, die auf die gleiche Weise definiert sind wie dieser Functor. Könnte das auch mit denen gemacht werden?

Und korrigiere mich, wenn ich falsch liege. Aber das gleiche kann nicht für Monad getan werden, weil es wirklich eine Instanz eines Endofunctors ist?

    
clinux 12.04.2015, 09:53
quelle

3 Antworten

3

Nun, zuerst -

  

... wenn es echte Funktoren benutzt und nicht nur Endofunctors ...

Haskell Funktoren sind echte Funktoren. Nur die Functor -Klasse erlaubt nicht irgendwelche Art von allgemeinen Funktoren, sondern nur die spezifischen, die endofunctors auf Hask sind.

Tatsächlich sind Nicht-Endo-Funktoren interessant; Mathematiker benutzen sie die ganze Zeit. Und während du sagst, es kann keine Non-Endofunctor-Monaden geben, ein Analog zu Applicative ist möglich: diese Klasse ist wirklich nur eine nette Haskell-Schnittstelle für monoiden Funktoren , die zwischen verschiedenen Kategorien definiert werden können. Sieht ungefähr so ​​aus:

%Vor%

Um dies tatsächlich überall so bequem wie die Standardklasse Applicative zu verwenden, benötigen Sie etwas mehr als nur die Klasse Monoidal . Dies wurde in einem Paar von Bibliotheken . Ich schrieb auch . Aber, naja ... es sieht nicht wirklich schön aus ...

%Vor%

Ich weiß nicht, ob eines dieser Frameworks Ihnen erlauben würde, den anwendungsspezifischen JS-Code auf praktische Weise zu schreiben. Möglicherweise, aber ich vermute eher, dass es sehr chaotisch werden würde. Beachten Sie auch, dass Sie, während Sie jetzt über Anwendungsprogramme verfügen, nicht heißen können, was Sie normalerweise mit Hask -Anwendungen in Js-Code tun - im Gegenteil, Sie müssten diese eigentlich umbrechen Anwendungen als Transformer um den Typ Js .

Sie sollten in Erwägung ziehen, "JS-Werte" als solche vollständig aufzugeben und nur stattdessen in ein Kategorie / Pfeil-Muster zu schreiben. Das heißt, drehen Sie die Definition um:

%Vor%

Hier verwenden wir () als Terminal-Objekt der JsFunc -Kategorie - was% co_de macht % Pfeile entsprechen dem, was wir normalerweise Werte nennen (zumindest wenn wir Striktheits-Semantik nicht berücksichtigen). Wenn Sie diese Route gehen, muss so ziemlich alles punktefrei geschrieben werden, aber es gibt Syntax, um sonst so zu tun , und Sie können Funktoren und sogar Monaden (wie Kleisli Pfeile) schön integrieren.

    
leftaroundabout 12.04.2015, 14:04
quelle
3

Laut dieser Mailing-Liste Post , sind anwendbare Funktoren in der Mathe-Literatur bekannt als "schwach symmetrische lax monoidale Funktoren". Eine (kurze, nicht sorgfältige) Betrachtung der nlab-Seite für lax monoidal deutet darauf hin, dass dieses Konzept ebenfalls parametrisiert ist durch zwei Kategorien, so können Sie wahrscheinlich diese parametrische Funktorklasse mit etwas Arbeit zu einer parametrischen Anwendungsklasse erweitern.

Wie Sie sagen, sind Monaden endofunctors, daher können sie nicht nach zwei Kategorien parametrisiert werden. Aber die eine Kategorie, die sie als Parameter haben, muss nicht Hask sein; also könnte man auch eine parametrisierte Monade geben, wie

%Vor%

Dann können wir eine Art Standardtrick verwenden, um bind zu definieren:

%Vor%

Die Operation (.) ist hier die Zusammensetzung aus der Category -Klasse, nicht die Funktion Zusammensetzung aus Prelude .

    
Daniel Wagner 12.04.2015 13:58
quelle
2
  

wir können cs JsFunc haben, d sei Hask und muss js

sein

Nun, nein, wir können nicht genau, da JsFunc ein Synonym von ungesättigtem Typ ist, daher können wir keine Variable ( c ) dafür instantiieren.

Sie könnten einen neuen Typ erstellen

%Vor%

und dann ein Functor JsCat (->) Js wie du sagst erstellen.

Allerdings gibt dies nichts Neues, denn wenn wir den Typ von fmap erweitern, wird es

%Vor%

Dies ist nichts anderes als eine Apply -Instanz für Js . Ich bin also nicht sicher, warum Sie dies zu einem Funktor machen wollen, wenn es bereits in eine bestehende Abstraktion passt.

    
Reid Barton 13.04.2015 00:16
quelle

Tags und Links