www.jammni.de

Logo - Kleiner Drache
Login
Username:

Passwort:

Daten merken
Auto-Login
Registrieren
 
Online
niemand
 
Forumsuche
Suche nach:

Logo - DracheHaskell-Forum

domjoe

Gepostet:
02.03.2011 16:59

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    
 
Siracusa

Gepostet:
02.03.2011 19:12

   
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    
 
Landei

Gepostet:
02.03.2011 23:31

   
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:


and' [] = True
and' (True : xs) = and' xs
and' (False : _) = False
Zum Seitenanfang    
 
domjoe

Gepostet:
05.03.2011 13:09

   
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    
 
Landei

Gepostet:
08.04.2011 15:41

   
Erwähnt sei noch die die Variante mit einem fold:


and\' xs = foldl (&&) True xs

-- oder kurz
and\' = foldl (&&) True
Zum Seitenanfang