2016-10-24 5 views
-1

Können Sie mir helfen, den Typ die folgenden Ausdrücke anzugeben?Was ist dieser Ausdruck?

Wenn der Ausdruck eine Prozedur definiert, geben Sie den Typ der so definierten Prozedur an. Für unknown Typ kann es verwendet werden A, B, C, usw.

Ich konnte es nicht tun, also hoffe ich, dass es jemanden gibt, der mir erklären kann.

1) (lambda (p) (+ 1 (p 3)))

2) (lambda (x y comp) (if (comp x y) (+ x 1) (+ y 1)))

+0

Beginnen Sie mit dem, was Sie wissen (wenn Sie beispielsweise '(+ 5 a)' haben, muss 'a' eine Zahl sein) und "füllen Sie die Lücken aus". – molbdnilo

Antwort

0

beim ersten Beispiel der Suche: (lambda (p) (+ 1 (p 3)))

Wir wissen, dass das Plus den Typ hat +: Number -> Zahl. Von hier können wir einige Dinge ableiten. Wenn p 3, eine Zahl, einnimmt, können wir bestimmen, dass es der Eingabetyp Nummer ist. Soweit kennen wir p: Nummer -> ????. Als nächstes können wir sehen, wo der Wert von (p 3) geht. Diese Daten werden sofort in + verwendet. Wir wissen bereits, dass die Art von Plus + ist: Nummer Nummer -> Nummer. Wir wissen dann, dass die Ausgabe von (p 3) auch eine Zahl sein muss. Daher wissen wir, dass p: Nummer -> Nummer. Das bedeutet, dass das ganze Lambda den Typ (Nummer -> Nummer) -> Nummer hat.

Im zweiten Beispiel (lambda (x y comp) (if (comp x y) (+ x 1) (+ y 1))) Wir wissen, dass x und y vom Typ Zahl sein müssen, weil sie von Plus verwendet werden. Von hier aus wissen wir auch, dass die Ausgabe von comp ein boolescher Wert sein muss, wie er in einem if-Ausdruck verwendet wird (in den meisten, wenn nicht allen Schemas, wird kein false-Wert in einer if-Anweisung als wahr betrachtet) könnte jeden Typ zurückgeben). Schließlich wissen wir, dass comp sowohl x als auch y annimmt, was beide Zahlen sind, so dass der Typ von comp Number Number -> Boolean sein muss. Das macht den Typ der Lambda-Nummer (Number Number -> Boolean) -> Number.