2017-09-15 3 views
0

ich folgende Fragen gegeben:Definition von (&&) unter Verwendung von Lambda-Ausdrücke

1.

True && True = True 
_ && _ = False 

ich dies als ein bedingter Ausdruck schrieb:

(&&) a b = if a then 
if b then True else False 
else False 

2.

True && b = b 
False && _ = False 

Ich schrieb dies als ein bedingter Ausdruck:

(&&) a b = if a then b else False 

Ich versuche, diese beiden Definitionen für (& &) in Lambda-Ausdruck gegeben zu schreiben, aber ich nicht genau, wo ich anfangen soll oder wie es zu tun. Im Allgemeinen

+0

Was meinst du mit „Lambda-Ausdruck“? – melpomene

+0

Wir haben dies als ein Beispiel gegeben: addiere x y = x + y und es ist add = \ x -> (\ y -> x + y) als ein Lambda-Ausdruck –

Antwort

1

, wenn

foo bar baz = quux 

dann die beiden Definitionen

foo = \bar baz -> quux -- OR 
foo = \bar -> \baz -> quux 

sind im wesentlichen identisch mit dem Original (bis zu einigen Sprechen Warzen, die sich um, indem einen expliziten Typen Signatur gearbeitet werden kann). Sie können wählen, welche Sie besser mögen. So

(&&) a b = if a then b else False 

kann auch geschrieben werden als:

(&&) = \a b -> if a then b else False 

Können Sie herausfinden, wie die andere nach diesem gleichen Muster zu tun?

2

Ich werde nicht einfach direkt die Antwort schreiben, weil dies wie eine Aufgabe/Hausaufgabe irgendeiner Art scheint. Also werde ich nur ein bisschen erklären, wie Lambdas funktionieren.

Werfen wir einen Grund Lambda nehmen und es brechen: \a b -> a

Auf der linken Seite des Pfeils (in diesem Fall ein b) wir die Argumente haben. Dies ist, was an das Lambda weitergegeben wird.

Auf der rechten Seite des Pfeils haben wir den Ausgang (in diesem Fall a). Was dieses Lambda macht, nimmt zwei Werte und gibt Ihnen den ersten.

könnte Der Ausgang jeder Ausdruck zum Beispiel, wenn wir Zahlen beschränken dann a und b werden wir myLambda = \a b -> a + b so myLambda 1 2 ausgeben würde, 3.

So konvertieren Sie Ihre Definitionen in lambdas nur nehmen Sie Ihre if then else Abschluss haben könnte und haben diese als der Ausdruck nach dem Pfeil im Lambda.

Sie können auch den Mustervergleich verwenden, der in den ursprünglichen Definitionen verwendet wurde, und den Wert in ein Lambda mit einer case of-Anweisung umwandeln. Dies nimmt einen Wert zwischen case und of und dann stellen Sie verschiedene auszugebende Ausdrücke bereit, abhängig davon, welcher Wert z.

case a of 
    True -> something1 
    False -> something2 

Damit würde in einem Lambda setzen geben Sie:

\a b -> case a of 
    value1 -> something1 
    value2 -> something2 

Aus Gründen der Vollständigkeit werde ich erwähnen, dass es eine Erweiterung LambdaCase Sprache ist, die Sie zu vereinfachen erlaubt:

\a -> case a of 
    value1 -> something1 
    value2 -> something2 

zu

\case 
    value1 -> something1 
    value2 -> something2 

Aber das ist nicht nötig und ich würde mir als Anfänger sicher keine Sorgen machen.

Ich hoffe, das hilft, fühlen sich frei, zur Klärung fragen :)

Verwandte Themen