From d1297aee25605ebc35124023c2523ce90abbc787 Mon Sep 17 00:00:00 2001 From: Gregor Kleen Date: Fri, 13 Nov 2015 19:01:12 +0100 Subject: Work on FFP A4-3 --- ws2015/FFP/blaetter/04/FFP_U04_Lazy.hs | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) (limited to 'ws2015') diff --git a/ws2015/FFP/blaetter/04/FFP_U04_Lazy.hs b/ws2015/FFP/blaetter/04/FFP_U04_Lazy.hs index 8051ef9..b84ad0b 100644 --- a/ws2015/FFP/blaetter/04/FFP_U04_Lazy.hs +++ b/ws2015/FFP/blaetter/04/FFP_U04_Lazy.hs @@ -17,7 +17,9 @@ import qualified Data.Map as Map import Data.Map (Map) import qualified Data.Set as Set import Data.Set (Set) -import qualified Data.List as List +import qualified Data.List as List ((\\)) + +import Data.Maybe (fromMaybe) ---- A4-1 Verzögerte Auswertung -- Gegeben ist folgendes Programm: @@ -158,6 +160,8 @@ rel2S = Set.fromList . rel2 transClS :: (Ord a) => (a -> Set a) -> Set a -> Set a transClS rel xs = build xs Set.empty where + res = build xs Set.empty + build xs known | Set.null xs = Set.empty | otherwise = xs' `Set.union` build xs' (xs' `Set.union` known) @@ -235,7 +239,10 @@ type Variable = String -- -- Einfache Implementierung der Auswertung : eval :: Term -> Term -eval = undefined -- !!! TODO !!! +eval (App f x) = case eval f of + (Abs v t) -> eval $ subst (v, x) t + t -> eval $ t +eval x = x {- Beispiele, ohne Auswertung unter einem Lambda, Konstanten cK, c1, usw. sind weiter unten, im Anhang der Datei definiert. @@ -282,7 +289,13 @@ evalS0 = evalS Map.empty -- Ihre Aufgabe ist es also, evalS zu implementieren: evalS :: Memory -> Term -> (Memory, Term) -evalS = undefined -- !!! TODO !!! +evalS m x@(Var v) = (,) m $ fromMaybe x $ Map.lookup v m +evalS m (App f x) = case f' of + (Abs v t) -> undefined + t -> evalS m' t + where + (m', f') <- evalS m f +evalS m x = (m, x) -- Dabei verfolgen wir folgende Auswertestrategie: -- -- cgit v1.2.3