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.
Große Antwort! Vielen Dank :) –