2012-04-06 7 views
1
val implies = 
    fn x y = case x of false andalso case y of false => true 
    | fn x y = case x of false andalso case y of true => true 
    | fn x y = case x of true andalso case y of false => false 
    | fn x y = case x of true andalso case y of true => true; 

Ich kann dies nicht kompilieren. Ich bin relativ neu in SML, also nicht ganz die allgemeine Sprache und Syntax. Was habe ich falsch gemacht?Warum funktioniert diese Wahr/Falsch-Implikationsfunktion nicht in SML?

Antwort

7

Es gibt verschiedene Dinge falsch:

  • Es gibt keine Argumente in implies Muster direkt passend zu tun.
  • case x of ist für Mustervergleich mit bestimmten Werten, nicht wie if/else Ausdruck, der boolesche Ausdrücke akzeptiert.
  • Die Syntax für Lambda sollte mit fn x => ... beginnen.

Eine schnelle Lösung:

fun implies x y = 
    case (x, y) of 
     (false, false) => true 
    | (false, true) => true 
    | (true, false) => false 
    | (true, true) => true 

, die zur besseren Lesbarkeit umgeschrieben werden kann als:

fun implies false false = true 
    | implies false true = true 
    | implies true false = false 
    | implies true true = true 

oder prägnanter von Propositionslogik Regel:

fun implies x y = (not x) orelse y 
+0

den ersten Vorschlag versucht, es kompilieren nicht. Immer diese Fehlermeldung: tut01.sml: 20.1 Fehler: Syntaxfehler: BAR mit WILD abgefangene Ausnahme Compile ersetzen [Kompilieren: "Syntaxfehler"] angehoben auf: ../compiler/Parse/main/smlfile.sml : 15.24-15.46 ../compiler/TopLevel/interact/evalloop.sml:44.55 ../compiler/TopLevel/interact/evalloop.sml:296.17-296.20 – Chucky

+0

Nun, entfernen Sie den ersten Balken (siehe mein Update) seit es ist überflüssig. – pad

+0

Immer noch eine Kompilierung Fehler :( – Chucky

4

In Bezug auf die anonyme Funktionen,

fun implies x y = (not x) orelse y 

als

val implies = fn x => fn y => (not x) orelse y 

jedoch geschrieben werden, wie Sie sehen, ist es nicht wirklich Sinn macht es auf diese Weise (in diesem Fall) zu tun.

Anonyme Funktionen in SML nehmen nur ein Argument. Currying von Argumenten funktioniert, weil das fun Schlüsselwort ist syntaktischer Zucker (auch eine abgeleitete Form genannt) von

val rec implies = fn x => fn y => 
    case (x, y) of 
     (x,y) => (not x) orelse y 

Der Fall wird verwendet, weil wir einige Musterabgleich in der ursprünglichen Funktion gehabt haben könnten, die dann direkt übersetzt wird nach unten in der Fall, und die rec ist, weil die ursprüngliche Funktion rekursiv sein könnte.

So das zweite Beispiel @pad gab entspricht:

val rec implies = fn x => fn y => 
    case (x, y) of 
     (false, false) => true 
    | (false, true) => true 
    | (true, false) => false 
    | (true, true) => true 
+0

+1 für die Klärung anonymer Funktionen. – pad

Verwandte Themen