2016-03-29 7 views
2

folgende Eingabe in einen GHC InterpreterVerwendung `` ++ in Muster

let describe' [email protected]([x] ++ [y]) = "The first letter of " ++ all ++ " is " ++ [x] 

Ausbeuten

Parserfehler in Musterabgleich: [x] ++ [y]

Warum kann Haskell das Muster [email protected]([x] ++ [y]) nicht mit Ausdrücken wie "HI" oder [1,2] abgleichen?

+0

Im Grunde kann er nicht wissen, was die Länge der Liste ist und '++' ist eigentlich eine Funktion, so dass Sie Muster dagegen nicht finden können, Haskell patternatch Konstruktoren zum Beispiel. – Netwave

+0

vielleicht weil es zweideutig ist? –

+0

Haskell sieht also nicht '[x] + [y]', es sieht den Rückgabewert von '++', was in diesem Fall eine Liste mehrdeutiger Größe ist? – George

Antwort

9

nehmen wir an, könnten Sie Muster-Match auf ++ - jetzt darüber nachdenken, wie man dieses Spiel könnte:

a ++ b = [1,2] 

Sie könnte:

  • a = [1,2], b = []
  • a = [1], b = [2]
  • a = [], b = [1,2]

jetzt was ist das richtige?


der technischen Grund ist, dass ++ keine Daten-Konstruktor ist;)


in Ihrer spezifischen Situation, die Sie

let describe' [email protected][x,y] = "The first letter of " ++ all ++ " is " ++ [x] 

(die nur entsprechen, werden Strings mit Länge verwenden könnte genau 2)

oder besser

let describe' [email protected](x:_) = "The first letter of " ++ all ++ " is " ++ [x] 

Spiele

eine sichere Version wäre dies

describe' :: String -> String 
describe' ""  = "your input was empty" 
describe' [email protected](x:_) = "The first letter of " ++ all ++ " is " ++ [x] 
+0

In der Tat!Wenn Mustervergleiche diese Magie wären, würde ich etwas versuchen wie "let foo (isProofOfPneqNP s) =" Eureka! "++ s in foo Wahr" ;-)) – chi

+1

Ich denke, das ist, wofür die Mäuse Erde bauen;) – Carsten

+0

. .. oder [Curry] (https://en.wikipedia.org/wiki/Curry_%28programming_language%29) (nur um zu sagen, dass solche Konstrukte prinzipiell möglich sind). – phg

6

Sie können nur Konstrukteuren in Muster verwenden (die alle Strings der Länge mindestens 1 übereinstimmen). Das Muster [x] entspricht dem Muster x:[], wobei : und [] beide Konstruktoren sind. ++ ist jedoch eine Funktion. Dies ist ein kleiner Fehler des Haskell-Sprachdesigns, da wir nicht schnell unterscheiden können, welche Symbole wir als Funktionen definiert haben und welche Symbole aus ihren Datentypdeklarationen zu uns kommen. Für eine vollständige Behandlung siehe section 3 of the Haskell 2010 Language Report.

+0

Obwohl ein Infix-Konstruktor * mit *: * beginnen muss, können Sie zumindest feststellen, welche Funktionen * nicht * -Konstruktoren sind. Also ist '++' definitiv kein Konstruktor, während etwas wie ': +' * * ein Konstruktor sein könnte. – chepner