2017-01-25 10 views
0

Kann jemand bitte erklären: "Beschreibung von g"? Wie kann f1 Einheit nehmen und gibt einen int & den Rest zurück, den ich auch verwirrt bin !!Pattern Matching SML?

(* Description of g: 
* g takes f1: unit -> int, f2: string -> int and p: pattern, and returns 
* an int. f1 and f2 are used to specify what number to be returned for 
* each Wildcard and Variable in p respectively. The return value is the 
* sum of all those numbers for all the patterns wrapped in p. 
*) 

datatype pattern = Wildcard 
       | Variable of string 
       | UnitP 
       | ConstP of int 
       | TupleP of pattern list 
       | ConstructorP of string * pattern 

datatype valu = Const of int 
       | Unit 
       | Tuple of valu list 
       | Constructor of string * valu 


fun g f1 f2 p = 
    let 
     val r = g f1 f2 
    in 
     case p of 
      Wildcard   => f1() 
     | Variable x   => f2 x 
     | TupleP ps   => List.foldl (fn (p,i) => (r p) + i) 0 ps 
     | ConstructorP (_,p) => r p 
     | _     => 0 
    end 

Wildcard passt alles und stellt die leere Liste von Bindungen.

Variable entspricht einem beliebigen Wert v und erzeugt die Ein-Element-Liste (s, v).

UnitP stimmt nur mit Unit überein und erzeugt die leere Liste der Bindungen.

ConstP 17 stimmt nur mit Const 17 überein und erzeugt die leere Liste der Bindungen (und ähnlich für andere Ganzzahlen).

TupleP ps entspricht einem Wert der Form Tuple vs wenn ps und gegen die gleiche Länge haben und für alle i, die i-te Element von ps entspricht dem i-ten Element vs. Die Liste der Bindungen erzeugt sind alle Listen aus den verschachtelten Musterübereinstimmungen zusammengefügt.

ConstructorP (s1, p) Streichhölzer Constructor (s2, v), wenn s1 und s2 die gleiche Zeichenfolge sind (Sie können sie mit = vergleichen kann) und p entspricht v. Die Liste der Bindungen erzeugt die Liste von der Nested Pattern Match. Wir nennen die Strings s1 und s2 den Konstruktornamen.

Nichts anderes stimmt überein.

Antwort

2

Kann jemand bitte erklären: "Beschreibung von g"? Wie kann f1 Einheit nehmen und gibt einen int & den Rest zurück, den ich auch verwirrt bin !!

  • Die Funktion g Typ hat (Einheit → int) → (string → int) → Muster → int, so dass es drei nimmt (curried) Parameter, von denen zwei Funktionen und einer ein Muster.

  • Die Parameter f1 und f2 müssen entweder deterministische Funktionen sein, die immer dieselbe Konstante Rück oder Funktionen mit Nebenwirkungen, die eine beliebige ganze Zahl/string zurückkehren kann bzw. durch externe Quellen bestimmt.

    Da der Kommentar spricht von „, welche Nummer für jede Wildcard und Variable zurückgegeben werden“, klingt es wahrscheinlicher, dass die f1 verschiedene Zahlen zu unterschiedlichen Zeiten zurückkehren soll (und ich bin nicht sicher, was Nummer bezieht sich im Falle von f2!). Eine Definition könnte dies sein:

    local 
        val counter = ref 0 
    in 
        fun uniqueInt() = !counter before counter := !counter + 1 
        fun uniqueString() = "s"^Int.toString (uniqueInt()) 
    end 
    

    Obwohl dies nur eine Vermutung ist. Diese Definition funktioniert nur bis Int.maxInt.

  • Der Kommentar beschreibt g ‚s Rückgabewert als

    [...] die Summe aller dieser Zahlen für alle in p gewickelt Mustern.

    Da die Zahlen keine Bedeutung nicht zugeschrieben, es scheint nicht, wie g jeden praktischen Zweck dient, sondern die Ausgabe einer beliebig gegebene Menge von f1 und f2 gegen einen beliebigen Test zu vergleichen, die nicht gegeben ist.

  • Catch-all-Muster sind oft schlecht:

    ... 
    | _ => 0 
    

    Nichts anderes passt.

    Der Grund dafür ist, dass, wenn Sie Muster mit zusätzlichen Typen von Mustern erweitern, wird die Compiler SieFormal ein fehlendes Muster in der Funktion nicht benachrichtigen g; der Catch-All wird irrtümlicherweise eine Bedeutung für möglicherweise noch nicht definierte Fälle implizieren.

+0

Große Antwort! Vielen Dank :) –