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.
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.
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.
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.
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.
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.
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
Tags und Links haskell functional-programming lambda-calculus monads untyped-variables