Einbetten von höherwertigen Typen (Monaden!) in den untypisierten Lambda-Kalkül

7

Es ist möglich, verschiedene Typen im untypisierten Lambda-Kalkül durch Funktionen höherer Ordnung zu kodieren.

%Vor%

Ich habe mich gefragt, ob es irgendwelche Forschungen gegeben hat, andere weniger konventionelle Typen einzubetten. Es wäre genial, wenn es einen Satz gäbe, der behauptet, dass jeder Typ eingebettet werden kann. Vielleicht gibt es Einschränkungen, zB können nur Typen * eingebettet werden.

Wenn es tatsächlich möglich ist, weniger konventionelle Typen darzustellen, wäre es schön, ein Beispiel zu sehen. Ich bin besonders gespannt darauf, wie die Mitglieder der Klasse monad type aussehen.

    
TheIronKnuckle 19.01.2012, 11:17
quelle

3 Antworten

12

Sie vermischen die Typenebene mit der Wertebene. Im nicht typisierten Lambda-Kalkül gibt es keine Monaden. Es kann monadische Operationen geben (Werteebene), aber keine Monaden (Typenebene). Die Operationen selbst können jedoch dieselben sein, so dass Sie keine Ausdruckskraft verlieren. Die Frage selbst macht also keinen Sinn.

    
ertes 19.01.2012, 11:24
quelle
17

Es ist möglich, so ziemlich jeden beliebigen Typ darzustellen. Aber da monadische Operationen für jeden Typ unterschiedlich implementiert werden, ist es nicht möglich, >>= einmal zu schreiben und es für jede Instanz funktionieren zu lassen.

Sie können jedoch allgemeine Funktionen schreiben, die von evidence der Instanz der typeclass abhängen. Betrachte e hier als Tupel, wobei fst e eine "bind" -Definition enthält und snd e eine "return" -Definition enthält.

%Vor%

Sie müssten dann für jede Instanz von Monad ein "Beweistupel" definieren. Beachten Sie, dass die Art, wie wir bind und return definiert haben: Sie funktionieren genauso wie die anderen "generischen" Monad-Methoden, die wir definiert haben: Zuerst müssen sie Beweise von Monad-ness erhalten, und dann sie Funktion wie erwartet.

Wir können Maybe als eine Funktion darstellen, die 2 Eingaben benötigt, die erste ist eine Funktion, die ausgeführt wird, wenn sie Just x ist, und die zweite ist ein Wert, der ersetzt werden soll, wenn sie Nothing ist.

%Vor%

Listen sind ähnlich, stellen eine Liste als ihre Faltfunktion dar. Daher ist eine Liste eine Funktion, die zwei Eingaben benötigt, ein "cons" und ein "empty". Es führt dann foldr myCons myEmpty auf der Liste aus.

%Vor%

Either ist auch einfach. Stellen Sie einen der beiden Typen als eine Funktion dar, die zwei Funktionen übernimmt: eine, die angewendet wird, wenn es sich um Left handelt, und eine, die angewendet wird, wenn es sich um Right handelt.

%Vor%

Vergiss nicht, Funktionen selbst (a ->) bilden eine Monade. Und alles im Lambda-Kalkül ist eine Funktion ... also ... denke nicht zu hart darüber nach. ;) Inspiriert direkt von der Quelle von Control.Monad. Instanzen

%Vor%     
Dan Burton 20.01.2012 02:50
quelle
1

Nun, wir haben bereits Tupel und boolesche Werte, daher können wir Either und wiederum jede nicht-rekursive Summenform basierend auf dieser darstellen:

%Vor%

Und Maybe ist ein Mitglied der Monad-Klasse. Die Übersetzung in die Lambda-Notation wird als Übung beibehalten.

    
Ingo 19.01.2012 11:33
quelle