/ / Warum kann ich in Haskell keine Übereinstimmung mit der Verkettungsfunktion (++) finden? - Haskell, Mustervergleich

Warum kann ich die Verkettungsfunktion (++) in Haskell nicht mit dem Muster vergleichen? - Haskell, Mustervergleich

Ich versuche zu passen **String Newline String** Muster in einer Funktion Split.

split::String -> [String]
split[] = []
split (x++"n":xs) = [x]++split(xs)

Ich bekomme diesen Fehler: Parse error in pattern: x ++ ("n" : xs)

Was mache ich hier falsch?

Ich weiß, dass es andere Wege gibt, um das gleiche Ergebnis zu erzielen, aber ich würde gerne verstehen, was mit diesem Muster nicht stimmt. Ich bin ziemlich neu für Haskell BTW.

Antworten:

12 für die Antwort № 1

Ein Problem (wie ich es verstehe) ist das ++ ist kein Konstruktor des Listdatentyps der Weg : ist. Sie können sich den Listendatentyp vorstellen, der als definiert ist

data [a] = [] | a : [a]

Woher : ist ein Konstruktor, der Elemente an den Anfang einer Liste anfügt. Jedoch, ++ ist eine Funktion (definiert in der Dokumentation hier: http://hackage.haskell.org/package/base-4.8.1.0/docs/src/GHC.Base.html#%2B%2B) wie

(++) :: [a] -> [a] -> [a]
(++) []     ys = ys
(++) (x:xs) ys = x : xs ++ ys

Wir könnten unsere eigene Datentypenliste wie definieren

data List a = Empty | Cons a (List a)

Das würde das Verhalten unserer vertrauten Liste nachahmen. In der Tat könnten Sie verwenden (Cons val) in einem Muster. Ich glaube, Sie könnten auch einen Typ mit einem Concat-Konstruktor definieren

data CList a = Empty | Cons a (CList a) | Concat (CList a) (CList a)

Welche Sie verwenden könnten, um zwei Listen zu verketten und die Verbindung zu einem zu verschieben. Mit einem solchen Datentyp könnten Sie ein Muster gegen die Concat xs ys Eingabe, aber Sie, die nur an der Grenze von zwei Listen arbeiten würde und nicht in der Mitte von einem.

Wie auch immer, ich bin selbst noch ziemlich neu für Haskell, aber ich hoffe, das ist in Ordnung.


5 für die Antwort № 2

Stellen Sie sich vor, Sie könnten. Dann passend "anbnc" könnte produzieren x = "a", xs = "bnc" oder x = "anb", xs = "c" und Sie brauchen eine Ad-Hoc-Regel, um zu entscheiden, welche zu verwenden ist. Ein Abgleich mit Funktionen ist im Allgemeinen auch nicht sinnvoll zu implementieren: Sie müssen einen finden x gegeben f xund es gibt keinen anderen Weg, als alles Mögliche zu versuchen x.