编辑:问题已解决。 我不知道在源文件中启用语言扩展并不会在 GHCi 中启用语言扩展。解决方法是在 GHCi 中输入 :set FlexibleContexts
。
我最近发现,在 Haskell 中,类和实例中的类型声明是 Horn 子句。因此,我将《Prolog 艺术》第 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
在Prolog中,证明过程中会为(逻辑)变量实例化值。然而,我不知道如何在Haskell中实例化类型变量。也就是说,我不知道Haskell中与Prolog查询相对应的方法。
?-f(X1,X2,...,Xn)
这里有一个假设,我认为
:t undefined :: (f x1 x2 ... xn) => xi
会导致Haskell实例化xi
,但即使启用了FlexibleContexts
,这也会导致Non type-variable argument in the constraint
错误。