Frage

Ich lerne funktionalen Programmierstil. In Sie die Monaden nicht Angst , gab Brian Beckman eine brillante Einführung über Monad. Er erwähnte, dass Monade ist über Zusammensetzung von Funktionen, um Komplexität zu adressieren.

  

A Monad enthält eine Funktion, die unit Typ T zu einem verstärkten Typ M (T) überträgt; und eine Funktion, die Bind, gegebene Funktion von T nach M (U), geben Sie wandelt M (T) in einem anderen Typ M (U). (U T kann sein, ist aber nicht notwendigerweise).

In meinem Verständnis, die Sprache der Umsetzung Monade sollte statisch typgeprüft werden. Andernfalls können Fehler Typ nicht während der Kompilierung und „Komplexität“ zu finden ist nicht geregelt. Ist mein Verständnis richtig?

War es hilfreich?

Lösung

Es gibt viele Implementierungen von Monaden in dynamisch typisierten Sprachen:

Im Allgemeinen ist die Kirche-Turing-These sagt uns, dass alles, was in getan werden kann, ein Sprache kann auch in getan werden alle anderen Sprache.

Wie Sie wahrscheinlich von der Auswahl der oben genannten Beispielen kann sagen, ich bin (meistens) ein Ruby-Programmierer. So, wie ein Witz, nahm ich eine der oben genannten Beispiele und es in einer Sprache neu implementiert, die ich kenne absolut nichts zu, dass in der Regel von als nicht sehr mächtiger Sprache gedacht wird, und dass scheint die einzige Programmiersprache auf dem Planeten zu sein, für die ich nicht in der Lage war, eine Monade Tutorial zu finden. Darf ich Ihnen vorstellen ... die Identität Monad in PHP:

<?php
class Identity {
  protected $val;
  public function __construct($val) { $this->val = $val; }
  public static function m_return($a) { return new Identity($a); }
  public static function m_bind($id_a, $f) { return $f($id_a->val); }
}

var_dump(Identity::m_bind(
  Identity::m_return(1), function ($x) {
    return Identity::m_return($x+1);
  }
));
?>

Keine statischen Typen, keine Generika, keine Verschlüsse erforderlich.

Nun, wenn Sie tatsächlich statisch Monaden überprüfen wollen, dann müssen Sie ein statisches Typsystem. Aber das ist mehr oder weniger eine Tautologie: Wenn Sie statisch wollen Typen überprüfen, müssen Sie eine statische Typprüfung. Duh.

In Bezug auf Ihre Frage:

  

In meinem Verständnis, die Sprache der Umsetzung Monade sollte statisch typgeprüft werden. Andernfalls können Fehler Typ nicht während der Kompilierung und „Komplexität“ zu finden ist nicht geregelt. Ist mein Verständnis richtig?

Sie haben Recht, aber das hat nichts mit Monaden zu tun. Dies ist nur über statische Typprüfung im Allgemeinen und gilt gleichermaßen für Arrays, Listen oder sogar nur langweilig ganze Zahlen sind.

Es gibt auch eine falsche Fährte hier: wenn Sie zum Beispiel sehen Monade Implementierungen in C #, Java oder C, sie sind viel länger und viel komplexer als, sagen wir, über dem PHP-Beispiel. Insbesondere gibt es t von Typen überall, so dass es sicher schaut beeindruckend. Aber die hässliche Wahrheit ist: C # 's, Java und C der Typ-Systeme sind nicht wirklich stark genug, um die Art der Monad auszudrücken. Insbesondere ist Monad ein Rang-2 polymorpher Typ, aber C # und Java nur Rang-1 polym unterstützenOrphismus (sie nennen es „Generika“, aber es ist die gleiche Sache) und C unterstützt nicht einmal das.

So sind Monaden in der Tat nicht statisch in C # Typ-geprüft, Java und C (Das ist zum Beispiel der Grund, warum die LINQ Monade Comprehensions als Muster definiert sind und nicht als Typ: weil man einfach der statische Typ-System der Fall ist, ist die Umsetzung sehr viel komplexer, ohne tatsächlich zu helfen machen den Typ in C #.) nicht ausdrücken . Es erfordert ein viel anspruchsvolle Typ-System wie Haskell, tatsächliche Typsicherheit für Monaden zu erhalten.

Hinweis: was ich oben geschrieben hätte nur gilt für den allgemeinen monad Typen selbst, wie @Porges darauf hinweist. Sie können natürlich auch die Art jeder Besondereeilverschiffenservice Monade, wie List oder Maybe, aber Sie können die Art der Monad selbst nicht ausdrücken. Und das bedeutet, dass Sie nicht typ überprüfen Sie die Tatsache, dass „List IS-A Monad“, und Sie können nicht typ überprüfen generische Operationen, die für alle Instanzen Monad arbeiten.

(Beachten Sie, dass diese Monad Überprüfung gehorcht auch die Monade Gesetze neben der Monade konformen type ist wahrscheinlich zu viel sogar für Haskell Typ-System. Sie würde wahrscheinlich muß abhängige Arten und vielleicht sogar eine ausgewachsene automatische Theorembeweiser dafür.)

Andere Tipps

Es ist sicherlich nicht der Fall, dass eine Sprache, die Umsetzung Monaden muss statisch typisiert werden, wie Ihre Frage Titel fragt. Es kann eine gute Idee, aus den Gründen, die Sie umreißen, aber Fehler bei der Kompilierung zu erkennenden Fehler aufgehört hat nie jemand. Schauen Sie sich nur, wie viele Leute schreiben PHP.

Sie müssen Verschlüsse für den Staat Monade. Ich sah es auf, PHP hat Schließungen seit 5.3. So wäre das kein Problem mehr sein.

Nein, in PHP ist es nicht möglich Monaden zu implementieren. Sie müssen Verschlüsse dafür. Nichts desto trotz kann das Konzept der vielleicht noch nützlich sein, wenn Sie Muster simulieren mit Klassen passend:

abstract class Maybe {
        abstract public function isJust();
        public function isNothing(){
                return !$this->isJust();
        }
}

class Just extends Maybe {
        protected $val = null;
        public function __construct($val){
                $this->val = $val;

        }
        public function isJust(){
                return true;
        }
        public function getVal(){
                return $this->val;
        }

}
class Nothing extends Maybe {
        protected $val = null;
        public function __construct(){

        }
        public function isJust(){
                return false;
        }
}

function just(){
        print "isJust";
}
function nothing(){
        print "nothing";
}
function MaybeFunc(Maybe $arg){
        if(get_class($arg) == 'Just'){
                print "Just";
        } else {
                print "Nothing";
        }
}

MaybeFunc(new Just(5));
MaybeFunc(new Nothing());
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top