2014-11-18 11 views
8

Ich versuche, ein Haskell-Datentyp ein bisschen wie ein Python-Wörterbuch zu machen, ein Rubin-Hash oder ein JavaScript-Objekt, in dem eine Zeichenfolge auf einen Wert verknüpft ist, etwa so:Syntaxregeln für Haskell Infix Datentyp Konstrukteurs

data Entry t = Entry String t 
type Dictionary t = [Entry t] 

Der obige Code funktioniert gut. Ich möchte jedoch einen etwas netteren Konstruktor, also habe ich versucht, es so zu definieren:

Dies schlug fehl. Ich habe es versucht:

data Entry t = [Char] ~> t 

Erneut ist es fehlgeschlagen. Ich weiß, dass ~ besondere Bedeutung in Haskell hat, und GHCi erlaubt noch die Bediener ~>, aber ich habe noch eine andere Art und Weise versucht:

data Entry t = [Char] & t 

Und noch einen weiteren Ausfall durch Fehler analysieren. Das finde ich verwirrend, weil aus irgendeinem unerklärlichen Grund, dies funktioniert:

data Entry t = String :> t 

Bedeutet dies, dass es bestimmte Regeln für welche Zeichen in Infix Typkonstruktoren auftreten können, oder ist es eine Besetzung von Fehlinterpretationen. Ich bin kein Neuling in Haskell, und ich bin mir bewusst, dass es idiomatischer wäre, den ersten Konstruktor zu verwenden, aber dieser hier stopft mich, und es scheint ein wichtiger Teil von Haskell zu sein, dass ich vermisse.

+2

Off-Topic, aber: 'Dictionary t wird sein * nichts wie *" ein Python-Wörterbuch, ein Ruby hashmap ", etc. Es ist nur eine verkettete Liste, nichts mehr. – gspr

+0

Ich stimme nicht zu. Mein Plan ist, mehrere Funktionen sowie Monoid- und Funktor-Instanzen zu machen, damit ich nach bestimmten Ergebnissen mit möglichen Fehlern suchen kann, ohne Maybe zu überladen. Das ist der einfache Teil, aber das habe ich nicht verstanden. – AJFarmar

+1

Was @gspr antreibt, sind die folgenden Unterschiede: Sie können nicht (direkt) einen 'String' und einen' Int' im selben 'Dictionary' speichern, die Suche wird im schlimmsten Fall linear sein, Sie können ' t zerstörerisch update (und Sie werden nie die nette 'dict [key]' Syntax bekommen). Es ist also nicht wirklich wie die Datenstrukturen, die Sie erwähnen ... – yatima2975

Antwort

9

Jeder Operator, der mit einem Doppelpunkt beginnt : ist ein Typkonstruktor oder ein Datenkonstruktor, mit Ausnahme von (->). Wenn Sie die Tilde wollen, könnten Sie :~> verwenden, aber Sie werden nicht damit durchkommen, etwas zu verwenden, das nicht mit einem Doppelpunkt beginnt. Source

+0

Genau genommen wäre ein _type-level operator_ ein Operator, der auf dem _left_ des '=' Zeichens erscheint. Das erfordert ein 'LANGUAGE'-Pragma. – MathematicalOrchid

+0

@MathematicalOrchid besser? – bheklilr

+0

Große Antwort, danke! – AJFarmar