1 2 | nächste Seite |
Gepostet: |
Startschwierigkeiten bei Aufgabe! | ||||||||||
Servus, Habe ein paar Verständnisprobleme bei folgender Aufgabe: Gegeben ist folgender Datentyp: data Aexpr = Num Int | Var String | Add Aexpr Aexpr | Sub Aexpr Aexpr | Mul Aexpr Aexpr | Div Aexpr Aexpr | deriving (Show,Eq) Soll jetzt eine Funktion schreiben simplify :: Aexpr -> Aexpr Die einen Ausdruck mit Folgenden Gleichungen vereinfacht: x+0 = x , x*1 = x, 0+x =x, 1*x =x, x-0 =x, x*0 = 0, x/1 =1, 0*x = 0 Der zu vereinfachende Ausdruck könnte z.B. wie folgt aussehen: expr1 = Sub(Mul (Num 1) (Var "ober")) (Add (Mul (Sub (Var "ammer") (Num 0)) (Num 0)) (Div (Var "gau") (Num 1))) Ich bräuchte da jetzt nur einen kleinen Tipp oder Denkantsoß, weil ich überhaupt nicht weiss wie ich da anfangen soll von der Syntax her, wahrscheinlich mit if -Ausdrücken oder besser vielleicht Wächtern. Wäre super nett, wenn ihr mir Helfen könntet! Serrambi |
|||||||||||
Zum Seitenanfang | |||||||||||
Gepostet: |
|||||||||||
ich antworte dir sobald ich etwas geschlafen habe...:-) gruß jacke |
|||||||||||
Zum Seitenanfang | |||||||||||
Gepostet: |
|||||||||||
ok ich hab dir einfach mal den anfang programmiert den rest kriegste auch alleine hin
use : c:\simplify expr1 Var "blub" gruß jacke ps:wenn du fragen hast einfach stellen...;-) |
|||||||||||
Zum Seitenanfang | |||||||||||
Gepostet: |
Danke! | ||||||||||
Vielen Dank, aber ich verstehe noch nicht ganz warum einmal simplify (Mul (Var str) (Num 1)) = Var str und dann nochmal : simplify (Mul x1 (Num 1)) = simplify x1 oder ist dann x1 noch ein zu vereinfachender ausdruck? oh mann , habe ja schon ganz ander sachen gemacht in haskel aber wenn es um selbst definierte datentypen geht verstehe ich die haskell-welt nicht mehr:-)! ich werde dann mal etwas rumtüfteln! gruß serrambi |
|||||||||||
Zum Seitenanfang | |||||||||||
Gepostet: |
|||||||||||
ja genau x1 kann man noch weiter vereinfachen...deswegen wende ich da die funktion noch weiter an... ich meine ist ja klar ausdruck + 0 = ausdruck ^^ und ausdruck*1= ausdruck... wie gesagt kriegste hin...:-) und wo bleibt den der ganze spaß wenn ich alles löse es fehtl zum beispiel noch ausdruck -0 =ausdruck ...und die kann man ja noch weiter vereinfachen...:-) und wenn nicht dann mußte ebend noch den fall schreiben simplify Var x=Var x simplify Num x=Num x usw. ist alles rekursiv ...:-) |
|||||||||||
Zum Seitenanfang | |||||||||||
Gepostet: |
?? | ||||||||||
so habe jetzt die restliche ausdrücke hinzugefügt . aber jett brauche ich doch irgendeine funktion die mit ifthenelse oder wächtern arbeitet oder nicht? etwa so simplify expr = if expr==(Mul (Var str) (Num 1)) then Var str else .... mein verständnis für diese aufgabe hat divh glaube ich net sehr von 0 entfernt ! wär nett wenn du mir nochmal helfen könntest . |
|||||||||||
Zum Seitenanfang | |||||||||||
Gepostet: |
|||||||||||
etwa so simplify expr = if expr==(Mul (Var str) (Num 1)) then Var str else .... simplify (Mul x1 (Num 1)) = simplify x1 genau das macht dieser ausdruck doch schon...haskell sucht sich automatisch das richtige simplify raus... wenn du das hier auch im quelltext hast...: simplify Var x=Var x dann kann haskell das alles auch auswerten...weil es das simplify nochmal Rekursiv auf x1 aufruft...und wenn in x1 dirnsteht das nochmal 0 dazu addiert werden soll dann wertet er das auch wieder aus ...usw... |
|||||||||||
Zum Seitenanfang | |||||||||||
Gepostet: |
|||||||||||
das is doch so aber noch nicht fertig: > simplify :: Aexpr -> Aexpr > simplify (Num x) = (Num x) > simplify (Var x) = (Var x) > simplify (Mul (Var str) (Num 1)) = Var str > simplify (Mul (Var str) (Num 0)) = Num 0 > simplify (Mul (Num 1) (Var str)) = Var str > simplify (Mul (Num 0) (Var str)) = Var str > simplify (Add (Var str) (Num 0)) = Var str > simplify (Add (Num 0) (Var str)) = Var str > simplify (Div (Var str) (Num 1)) = Var str > simplify (Sub (Var str) (Num 0)) = Var str > simplify (Mul x (Num 0)) = Num 0 > simplify (Mul x (Num 1)) = simplify x > simplify (Add x (Num 0)) = simplify x > simplify (Add (Num 0) x) = simplify x > simplify (Sub x (Num 0)) = simplify x > simplify (Div x (Num 1)) = simplify x bekomme folgende fehlermeldung: Main> simplify Sub(Mul (Num 1) (Var "ober"))(Add (Mul (Sub (Var "ammer") (Num 0)) (Num 0))(Div (Var "gau") (Num 1))) ERROR - Type error in application *** Expression : simplify Sub (Mul (Num 1) (Var "ober")) (Add (Mul (Sub (Var "ammer") (Num 0)) (Num 0)) (Div (Var "gau") (Num 1))) *** Term : simplify *** Type : Aexpr -> Aexpr *** Does not match : a -> b -> c -> d oder wenn ich den gesamten ausdruck eigeklammert habe eien pattern match failure ! |
|||||||||||
Zum Seitenanfang | |||||||||||
Gepostet: |
|||||||||||
und so verwendet mans: c:\simplify expr2 Sub (Var "ober") (Var "gau") du hattest recht man kam um die fallunterscheidung doch nicht rum... die striche sind wie if abfragen...und alles was danach in klammern steht ist die bedingung simplify x y |(Bedingung) = daswasausgeführtwerdensoll |otherwise = undderelsezweig gruß jacke ps: hast aber super vorarbeit geleistet :-) |
|||||||||||
Zum Seitenanfang | |||||||||||
Gepostet: |
Vielen Dank! | ||||||||||
Vielen Dank, herrlich diese ironie!!;-) ne ich habe das voll nicht gecheckt ! überhaupt keinen zugang zu dieser aufgabe ! du bist echt der wahnsinn;-) hoffe ich muss dich nie wieder belästigen;-) nochmals danke |
|||||||||||
Zum Seitenanfang | |||||||||||
1 2 | nächste Seite |