Создать экземпляр переменной типа в Haskell

РЕДАКТИРОВАТЬ: Решено. Я не знал, что включение языкового расширения в исходном файле не включило языковое расширение в GHCi. Решением было : установить FlexibleContexts в GHCi.


Недавно я обнаружил, что объявления типов в классах и экземплярах в Haskell являются предложениями Horn. Итак, я закодировал арифметические операции из Искусство Пролога , глава 3, в Haskell. Например:

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

В Прологе значения инстанцируются для (логической) переменной в доказательстве. Однако я не • понимать, как создавать экземпляры переменных типа в Haskell. То есть я не понимаю, что такое Haskell-эквивалент запроса Prolog

?-f(X1,X2,...,Xn)

. Я предполагаю, что

:t undefined :: (f x1 x2 ... xn) => xi

заставит Haskell создать экземпляр xi , но это приведет к ошибке Non-type-variable argument в ограничении , даже при включенном FlexibleContexts .

5
задан false 28 July 2012 в 19:27
поделиться