2013-09-21 3 views
22

Ich bin nicht in der Lage, diese Codezeile in Haskell kompiliert zu bekommen, aber es funktioniert auf meinem Professor System. Ich benutze ghci Version 7.6.2.Haskell Zeile des Codes nicht kompilieren: "Illegal Datentyp Kontext"

data Eq a => Shape a = Shape a 

Genauer gesagt, ist dies der Fehler, den ich immer bin

[1 of 1] Compiling Main    (test.hs, interpreted) 

test.hs:1:6: 
Illegal datatype context (use -XDatatypeContexts): Eq a => 
Failed, modules loaded: none. 

Was ist der Fehler hier?

Dank

+0

Mögliche Duplikate von [Wie zu beheben "Illegal Datentyp Kontext" (verwenden Sie -XDatatypeContexts)?] (Http://StackOverflow.com/Questions/22622399/How-to-fix-illegal-datatype-context-use-xdatatypecontexts) – wizzup

Antwort

31

Ihr Professor verwendet wahrscheinlich eine ältere Version von GHC. Die von Ihnen gepostete Zeile verwendet eine Funktion, die vor Kurzem entfernt wurde. Die möglichen Lösungen sind:

  1. Eq a => entfernen und data Shape a = Shape a schreiben.

  2. Wie GHC sagt, geben Sie das Flag -XDatatypeContexts ein, um das entfernte Feature wieder zu aktivieren.

Genauer gesagt: die Eq a => Teil Ihrer Typdeklaration ist ein Datentyp Kontext genannt. Seine einzige Funktion ist es, den Typ des Shape Konstruktors zu beschränken, so dass Sie anstelle von Shape :: a -> Shape aShape :: Eq a => a -> Shape a erhalten. Es erspart Ihnen nicht, in Typensignaturen zu schreiben, die Shape s enthalten, und tatsächlich werden Sie sogar aufgefordert, sie zu schreiben, wenn Sie es sonst nicht benötigen würden. Es war einmal nützlich, wenn strikte Felder in Datentypen eine Klassenbeschränkung erforderten, aber diese Funktion wurde vor langer Zeit entfernt.

Kurz gesagt, ist das Entfernen des Kontexts fast immer eine Verbesserung für Ihr Programm, daher wurden sie aus dem Haskell 2011-Sprachstandard entfernt. Seit GHC 7.0.1 gibt es eine Option zum Ausschalten und seit 7.2.1 war es die Standardeinstellung.

+0

Sicherlich ist der Zweck einer solchen Einschränkung nicht, mein Schreiben zu ersparen, sondern die Typensicherheit zu verbessern, indem ich gezwungen werde, mehr zu schreiben, als ich es sonst tun müsste. – Psachnodaimonia

+0

Sorry, geben Sie Sicherheit ist nicht wirklich das Wort, das ich suche. Ich denke, dass das Hinzufügen des Kontextes eine engere Verbindung zwischen den syntaktischen Möglichkeiten des Programms und meiner semantischen Absicht schafft, und dadurch wird die Typprüfung bestimmte semantische Fehler unmöglich machen. – Psachnodaimonia

+0

@Psnachodaimonia: das ist keine unzumutbare Sichtweise, aber ich denke, diese besondere Funktion ist verwirrender als hilfreich, da viele Menschen erwarten, dass es sich anders verhält als es tut. –

5

denke ich die Fehlermeldung in klar ist, was es sagt. Sie brauchen dafür eine Erweiterung.

{-# LANGUAGE DatatypeContexts #-} 
data Eq a => Foo a = Foo a 

Obwohl diese Erweiterung standardmäßig verwendet werden soll, jedoch ausgehend von ghc 7.6 ist seine Verwendung deprecated angesehen und wird in der Zukunft entfernt werden. Also könnte Ihr Professor eine ältere Version von ghc verwenden.

+0

Anstatt diese Zeile jedes Mal hinzuzufügen (ich weiß auch nicht, was es genau funktioniert), ich 'Daten Foo a = Foo ein Ableitung Eq' Vielen Dank für Ihre Antwort :) – Goutham

+1

es Einschränkungen die Typen' zu verwenden, entschieden Foo' kann nehmen, um Eq Instanz zu haben. Angenommen, "Bar" ist ein Typ ohne "Eq" -Instanz, Sie können nicht den Typ "Foo Bar" haben. Auf der anderen Seite leitet das Ableiten von "Eq" eine Standard "Eq" -Instanz für "Foo" ab. Sie können den Typ "Foo Bar" haben (wobei "Bar" keine "Eq" -Instanz hat), aber Sie können nicht '==' darauf verwenden. – Satvik