Record-Typ pattern matching in Ocaml
Ich versuche, mithilfe der Mustererkennung wird ein zu schreiben ein-Rechner-Anwendung.
Zwei Haupttypen wie folgt definiert:
type key = Plus | Minus | Multi | Div | Equals | Digit of int;;
type state = {
lcd: int; (* last computation done *)
lka: key; (* last key actived *)
loa: key; (* last operation actived *)
vpr: int (* value print on the screen *)
};;
let print_state s =
match s with
state (a,_,_,d) -> print_int a; //Here has the compile error
print_newline();
print_int d;
print_newline();;
Allerdings, wenn ich einem Staat wie:
let initial_state = { lcd=0; lka=Equals; loa=Equals; vpr=0 } ;;
Dann, wenn ich zum aufrufen der Funktion:
print_state initial_state;;
Wird es die compile-Fehler. Jeder kann sagen, was der Grund für misslungene Zusammenstellung. Vielen Dank im adv.
Error: Syntax error
unexpected token "("
- Aber warum sind Sie pattern-matching auf Aufzeichnungen? Um die
lcd
ausinitial_state
verwendeninitial_state.lcd
.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Einen Datensatz Muster sieht aus wie eine Schallplatte:
=
Teil, wenn Sie die Namen der Variablen in der gleichen Weise, wie das label:match s with {lcd; vpr; _ } -> print_int lcd; print_int vpr
.let print_state {lcd; vpr; _} = ...
sollte genug sein.{a = lcd...
), bevor Sie googeln das, was scheint natürlicher zu mir, aber hey. Zumindest gibt es wird einen Weg. Danke für die Antwort, und danke an @yjasrc für die Frage.{lcd; vpr; lka = _lka; loa = _loa;}
Es könnte anders sein, wenn es viele Felder, aber wenn es nur eine Handvoll, es ist interessanter, zu sehen, was verfügbar ist, wenn Sie den Kodex gelesen, auch wenn die Felder werden momentan nicht verwendet.