2015-02-18 14 views
6

Ich habe viel Mühe, diese Funktion immer arbeiten:erstellen verketten Funktion in Haskell: [String] -> String

concatenate :: [String] -> String 

Es wurde entwickelt, um einfach eine Liste von Strings zu nehmen und eine einzelne Rück Zeichenfolge, die das Ergebnis der Verkettungen jedes Elements der Liste von Kopf zu Ende ist. Ich versuche, innerhalb der map, foldl und foldr Funktionen zu bleiben. Ich habe das Gefühl, dass ich weiß, was das Konzept dieser Funktionen gut genug macht, aber das häufigste Problem ist, dass ich einen Artenkonflikt habe. GHC wird zum Beispiel ein [Char] erwarten, und ich werde Code einfügen, der anscheinend versucht, ein [[Char]] zu benutzen, ohne dass ich es weiß.

Zum Beispiel: concatenate (x:xs) = foldr (++) x (concatenate xs)

Und ich bekomme den folgenden Compiler-Fehler:

Couldn't match type `Char' with `[Char]' 
Expected type: [[Char]] 
    Actual type: String 
In the return type of a call of `concatenate' 
In the third argument of `foldr', namely `(concatenate xs)' 
In the expression: foldr (++) x (concatenate xs) 

Ich bin sehr neu in Haskell, so wenden Sie sich bitte lachen frei fühlen. Härte wird erwartet und willkommen geheißen, solange eine für einen Neuling geeignete Erklärung ebenfalls enthalten ist. Danke für jede Hilfe.

Antwort

9

Sie brauchen den rekursiven Aufruf dort eigentlich nicht. Die Funktion foldr simuliert bereits einen rekursiven Aufruf. Alles, was Sie tun müssen, ist die Verwendung:

concatenate :: [String] -> String 
concatenate ls = foldr (++) "" ls 

Und denken Sie daran, dass es bereits ein concat function ist, die mehr generisch ist, wie es auf jeder Liste der Liste arbeitet (im Gegensatz zu einfach Liste von Strings entgegengesetzt).

+2

Und es war so einfach ... Danke. Es ist ziemlich schwierig für mich, in die Denkweise einzusteigen, die für die Entwicklung von Funktionen in Haskell erforderlich ist, nachdem ich direkt von C gekommen bin. Und über "concat" weiß ich, dass es existiert, aber ich versuche diese grundlegenden Funktionen zu verstehen, indem ich meine eigenen Versionen mache. Es hat in der Vergangenheit in anderen Sprachen geholfen. – UnworthyToast