2017-01-22 4 views
0

ich einige Haskell-Code haben und schreiben Sie müssen Ganz links-innerste (call by value) und äußerste (Call-by-name):finden outmost Bewertung (Haskell)

second :: [Int] -> Int 
second []   = 0 
second (_:[])  = 0 
second (_:x:xs)  = x 

doubleEach :: [Int] -> [Int] 
doubleEach []   = [] 
doubleEach (x:xs) = x * 2 : (doubleEach xs) 

repeat :: Int -> Int -> [Int] 
repeat x n = if n > 0 then x : (repeat x (n-1)) else [] 


repeat (second (doubleEach [2,3,5])) (second [3, 1, 4]) 

innerste (Call-by-Wert):

1. repeat (second (doubleEach [2,3,5])) (second [3,1,4]) 
2. repeat (second 4 : doubleEach [3,5])) (1) 
3. repeat (second (4 : 6 : d [5])) (1) 
4. repeat (second (4 : 6 : 10)) (1) 
5. repeat (6) (1) 
6. [6] 

Frage: Wie kann ich äußerste erhalten (Call-by-name) stept Schritt AUSWERT tion? Ich verstehe nicht, wie ich das tun kann, wenn Wiederholung benötigt, um Werte zu arbeiten, und sie sind nicht gegeben, bis der innere Teil nicht ausgewertet wird.

+2

Es ist sehr unklar, was Sie wollen, möchten Sie einige Strings zippen? Bitte zeigen Sie uns die volle erwartete Leistung. –

+0

Jedes Programm kann in Call-by-Value- und in Call-by-Name-Strategie ausgeführt werden. Ich verstehe nicht, wie man die Schritte aufschreibt, die das Programm für die Anruf-nach-Name-Strategie ausführt. Ich hoffe es ist klarer was ich meine. – jublikon

+5

Das ist nicht wirklich Haskell. Ich bin mir nicht einmal sicher, ob es wirklich auf Stackoverflow gehört ... Vielleicht cs.stackexchange? – Alec

Antwort

2

Wie kann ich Schritt für Schritt die äußerste (Call-by-Name) -Auswertung erreichen? Ich verstehe nicht, wie ich das tun kann, wenn Wiederholung benötigt, um Werte zu arbeiten, und sie sind nicht gegeben, bis der innere Teil nicht ausgewertet wird.

Sie brauchen die Werte nicht, um den Funktionsaufruf zu erweitern - Sie können einfach die unbewerteten Ausdrücke übergeben. Und dann werten Sie nur diese Ausdrücke aus, wenn es für if s, Musterübereinstimmungen oder primitive Funktionen notwendig ist. So funktioniert die Anruf-für-Name-Auswertung.

So Ihr erster Schritt wäre es, den Körper von repeat zu nehmen, ersetzen Sie jedes Vorkommen von x mit second (doubleEach [2,3,5]) und jedes Vorkommen von n mit second [3, 1, 4]. Dann müssen Sie den Zustand if auswerten und dann mit dem Körper des if fortfahren.