BEARBEITEN: Gelöst. Ich wusste nicht, dass das Aktivieren einer Spracherweiterung in der Quelldatei die Spracherweiterung in GHCi nicht aktiviert hat. Die Lösung war :set FlexibleContexts
in GHCi.Instantiiertyp Variable in Haskell
Ich habe kürzlich entdeckt, dass Typdeklarationen in Klassen und Instanzen in Haskell Horn-Klauseln sind. Also habe ich die arithmetischen Operationen von The Art of Prolog, Kapitel 3 in Haskell codiert. Zum Beispiel:
fac(0,s(0)).
fac(s(N),F) :- fac(N,X), mult(s(N),X,F).
class Fac x y | x -> y
instance Fac Z (S Z)
instance (Fac n x, Mult (S n) x f) => Fac (S n) f
pow(s(X),0,0) :- nat(X).
pow(0,s(X),s(0)) :- nat(X).
pow(s(N),X,Y) :- pow(N,X,Z), mult(Z,X,Y).
class Pow x y z | x y -> z
instance (N n) => Pow (S n) Z Z
instance (N n) => Pow Z (S n) (S Z)
instance (Pow n x z, Mult z x y) => Pow (S n) x y
In Prolog werden Werte für (logische) Variable in einem Beweis instanziiert. Ich verstehe jedoch nicht, wie man Typvariablen in Haskell instanziiert. Das heißt, ich verstehe nicht, was das Haskell-Äquivalent einer Prolog-Abfrage
ist. Ich gehe davon aus, dass
:t undefined :: (f x1 x2 ... xn) => xi
verursachen würde Haskell xi
instanziiert, aber das gibt einen Non type-variable argument in the constraint
Fehler, auch mit FlexibleContexts
aktiviert.
Denken Sie daran, dass Prolog nicht in haskells Typensystem eingebettet ist. Der Typklassen-Solver führt * kein Backtracking * durch. – luqui
Sie haben Recht; Ich hatte jedoch keinen Eindruck davon. Eine tatsächliche Einbettung würde viel mehr Arbeit erfordern :). – danportin