Gepostet: |
and :: [bool] -> bool | ||||||||||
Hallo Zusammen, ich versuche gerade eine Aufgabe aus dem Buch "Programming in Haskell" zu lösen: 3. Without looking at the definitions from the standard prelude, define the following library functions using recursion. – Decide if all logical values in a list are True: and :: [Bool ] → Bool Mein Lösungsansatz sieht nun wie folgt aus: andnew :: [Bool] -> Bool andnew [] = True andnew [x:xs] = x (&&) andnew xs nun meckert der Compiler: Couldn't match expected type 'Bool' against inferred type '[a]' Ist wahrscheinlich eine total blöde Frage, aber warum? |
|||||||||||
Zum Seitenanfang | |||||||||||
Gepostet: |
|||||||||||
Hallo, zwei Fehler: 1.) Im Muster bedeutet [x:xs] eine Liste mit genau einem Element, das wiederum eine Liste ist mit einem Kopf x und einem Rest xs. Richtig wäre hier runde Klammern zu verwenden. 2.) In Haskell kann man Operatoren in Infixnotation benutzen, z.B. 1 + 2. Schreibt man aber runde Klammern um den Operator, dann wird daraus eine "normale" Funktion, die genauso verwendet werden kann wie ein Bezeichner der nur aus Buchstaben besteht (vereinfacht gesagt). Somit sind die Ausdrücke 1 + 2 und (+) 1 2 äquivalent. Das ist z.B. praktisch bei solchen Sachen wie zipWith (+) [1,2,3] [10,10,10] == [11,12,13] In deinem Fall würde also nicht das Infix-&& verwendet werden, sondern es würde versucht werden, das x als Funktion anzusehen, die die Parameter (&&), andnew und xs bekommen würde. Wenn du dort also die runden Klamemrn entfernst sollte es klappen. Viele Grüße, Siracusa |
|||||||||||
Zum Seitenanfang | |||||||||||
Gepostet: |
|||||||||||
Mit Siracusas Tipps sollte es klappen. Eine andere Variante wäre, den Kopf der Liste mit Pattern Matching zu "untersuchen", so dass du gar kein && mehr brauchst:
|
|||||||||||
Zum Seitenanfang | |||||||||||
Gepostet: |
|||||||||||
Vielen Dank Euch Beiden, jetzt ist mir die Sache schon wieder ein bisschen klarer geworden. Bei so guten Antworten, werde ich mich sicher noch häufiger hier blicken lassen! Grüße, domjoe |
|||||||||||
Zum Seitenanfang | |||||||||||
Gepostet: |
|||||||||||
Erwähnt sei noch die die Variante mit einem fold:
|
|||||||||||
Zum Seitenanfang | |||||||||||