EDYCJA: Rozwiązany. Nie wiedziałem, że włączenie rozszerzenia językowego w pliku źródłowym nie umożliwiło rozszerzenia języka w GHCi. Rozwiązaniem było :set FlexibleContexts
w GHCi.Zmienna typu instancji w Haskell
Niedawno odkryłem, że deklaracje typów w klasach i instancjach w Haskell są klauzulami Horn. Więc zakodowałem operacje arytmetyczne z Art of Prolog, rozdział 3, na Haskella. Na przykład:
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
W Prologu wartości są tworzone dla zmiennej (logicznej) w dowodzie. Jednak nie rozumiem, jak utworzyć instancję zmiennych typu Haskell. To znaczy, nie rozumiem, jaki jest odpowiednik Haskella w zapytaniu Prologa. Zakładam, że
:t undefined :: (f x1 x2 ... xn) => xi
spowodowałoby Haskell instancji xi
, ale daje to błąd Non type-variable argument in the constraint
, nawet z FlexibleContexts
włączone.
Należy pamiętać, że to nie osadza prologu w systemie typu haskell. Solver typu na klawiaturze * nie cofa się *. – luqui
Masz rację; jednak nie miałem wrażenia, że tak się stało. Faktyczne osadzanie wymagałoby znacznie więcej pracy :). – danportin