Gepostet: |
anzElement liefert die Anzahl des Auftretes eines gegebenen Elements in einer Liste | ||||||||||
Hallo, in der Überschrift seht ihr schon meine Aufgabe, die wir u. a. aufbekommen haben. Ich habe grade mal 90 Minuten mit Haskell gearbeitet und soll nun mit den drei Dingen diese Aufgabe lösen: 1) rekursiv mit Musteranpassung 2) rekursiv ohne Musteranpassung (guards) 3) mit Akkumulatortechnik Also ich habe bisher das: -- anzElement (Zählt die Anzahl von x bzw y in Liste xs) Alles bis auf das mit dem Akku funktioniert.. Könnt ihr mir helfen? Liebe Grüße Sterly |
|||||||||||
Zum Seitenanfang | |||||||||||
Gepostet: |
|||||||||||
Wenn ich das richtig sehe, hast du in der 2. Zeile der Def. von anzElement3 vergessen darauf zu prüfen, ob y == x oder nicht, oder? | |||||||||||
Zum Seitenanfang | |||||||||||
Gepostet: |
|||||||||||
Dabei wandelt fromEnum Aufzählungstypen (wie hier Bool) in Zahlen um, ist also kürzer für if x == y then 1 else 0 Die kürzeste Lösung für diese Aufgabe wäre wohl
Willkommen in der wunderbaren Welt von Haskell :-) |
|||||||||||
Zum Seitenanfang | |||||||||||
Gepostet: |
|||||||||||
Ist die schönere Lösung eigentlich genau so effizient wie die anderen lösungen, d.h. wird beim Compilieren das zusätzliche Durchlaufen der Liste \'wegoptimiert\'? | |||||||||||
Zum Seitenanfang | |||||||||||
Gepostet: |
|||||||||||
Ich denke nicht. Ein guter Kompromiss zwischen Lesbarkeit und Performance wäre ein Fold:
Ich wundere mich sowieso, wieso es kein count :: (a -> Bool) -> [a] -> Int im Prelude gibt. |
|||||||||||
Zum Seitenanfang | |||||||||||
Gepostet: |
|||||||||||
Hallo ihr Lieben, danke für euren schnellen Antworten, dass wir x == y machen müssten, war uns bewusst, aber irgendwie gibt dann Haskell eine Fehlermeldung aus: anzElement3 x xs = anzElement3\' x xs 0 Fehlermeldung: 2.hs:2:37: parse error on input `=\' Irgendwie verzweifle ich :( |
|||||||||||
Zum Seitenanfang | |||||||||||
Gepostet: |
|||||||||||
Die Syntax stimmt nicht. Ihr könnt Guards verwenden, dann muss in der zweiten Zeile das erste = durch | ersetzt werden. Allerdings fehlt euch dann immer noch der Fall einer nicht-leeren Liste mit y != x. Oder ihr verwendet ein ganz normales if-then-else. | |||||||||||
Zum Seitenanfang | |||||||||||