Warum hat MFunctors 'hiist' nicht 'Monad n' constraint?

8

Ich habe einen Coroutine-Transformator

%Vor%

mit Monad instance

%Vor%

Wenn ich eine MFunctor Klasse mit Monad m und Monad n Einschränkungen definiere, kann ich hoist

definieren %Vor%

Aber mmorph s hoist hat nur eine Monad m Einschränkung. Kann ich mein hoist ohne es definieren, oder ist das ein Mangel an Allgemeinheit von MFunctor ?

EDIT: Ich habe herausgefunden, dass es möglich ist ist ! Aber meine Frage steht immer noch: Sind wir sicher, dass es hier an Allgemeingültigkeit nicht mangelt?

%Vor%     
Tom Ellis 27.01.2014, 21:12
quelle

2 Antworten

8

mmorph wurde im Kontext der pipes-3.* -Serie entwickelt (früher war es ein internes pipes Modul ), das Funktionen wie folgt hatte:

%Vor%

Wenn Sie die Monad n Einschränkung zu hoist hinzufügen, müssen Sie eine Monad (t2 m) Einschränkung zu raise hinzufügen. Ich versuche generell Einschränkungen in meinen Bibliotheken zu minimieren und ich konnte keine MFunctor Instanzen finden, die die Monad n Einschränkung benötigen, also habe ich sie entfernt.

Randnotiz: CoT y m a ist dasselbe wie Producer y m a von pipes , die bereits eine MFunctor -Instanz hat.

    
Gabriel Gonzalez 28.01.2014 05:31
quelle
1

Sie können einen beliebigen Typ t verwenden, für den Sie hoist' :: (Monad m, Monad n) => (forall t. m t -> n t) -> t m a -> t n a als MFunctor definieren können. Sie können das resultierende t n a jedoch nur verwenden, wenn Sie eine Monad -Instanz für n haben. Wir tun dies, indem wir die Anwendung der natürlichen Transformation aufschieben. Oder eine phantastische Art, dies zu sagen, wäre die Anwendung des Coyoneda-Lemmas.

%Vor%

Ich denke also nicht, dass wir die Allgemeinheit verlieren, denn wenn Sie keine Instanz für MFunctor implementieren können, geht nichts verloren durch die Monad Einschränkung für lowerMCoyoneda' .

Ich entdeckte, dass dies in ein ähnliches Problem mit RVarT .

    
jpath 23.01.2017 22:28
quelle

Tags und Links