EDIT: Solucionado. No estaba al tanto de que habilitar una extensión de idioma en el archivo fuente no permitía la extensión de idioma en GHCi. La solución fue :set FlexibleContexts
en GHCi.Variable de tipo de instancia en Haskell
Recientemente descubrí que las declaraciones de tipo en clases e instancias en Haskell son cláusulas Horn. Así que codifiqué las operaciones aritméticas de The Art of Prolog, Capítulo 3, en Haskell. Por ejemplo:
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
En Prolog, los valores se instancian para la variable (lógica) en una prueba. Sin embargo, no entiendo cómo crear instancias de variables de tipo en Haskell. Es decir, no entiendo cuál es el equivalente de Haskell de una consulta de Prolog
?-f(X1,X2,...,Xn)
es. Asumo que
:t undefined :: (f x1 x2 ... xn) => xi
causaría Haskell crear una instancia de xi
, pero esto da un error Non type-variable argument in the constraint
, incluso con FlexibleContexts
habilitado.
Tenga en cuenta que esto no incluye prolog en el sistema de tipos de haskell. El solucionador de clases de tipos * no retrocede *. – luqui
Tienes razón; sin embargo, no tenía la menor impresión de que así fuera. Una incrustación real requeriría mucho más trabajo :). – danportin