EDIT:解決済み。ソースファイルで言語拡張を有効にしてもGHCiで言語拡張が有効になっていないことはわかりませんでした。解はGHCiにおいて:set FlexibleContexts
であった。Haskellで型変数をインスタンス化する
私は最近、Haskellのクラスとインスタンスの型宣言がホーン節であることを発見しました。そこで、私は、のプロローグのテクニックの第3章をハスケルに符号化しました。例えば:Prologで
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で型変数をインスタンス化する方法を理解していません。つまり、私はPrologクエリのハスケル相当のものを理解していません。
?-f(X1,X2,...,Xn)
です。私はFlexibleContexts
が有効になっていても、
:t undefined :: (f x1 x2 ... xn) => xi
は、Haskellはxi
をインスタンス化する原因となるが、これはNon type-variable argument in the constraint
エラーを与えることを前提としています。
これは、haskellのタイプシステムにプロローグを埋め込まないことに注意してください。 typeclassソルバはバックトラックを行いません。 – luqui
あなたは正しいです。しかし、私はそれが何の印象もなかった。実際の埋め込みにはもっと多くの作業が必要です:)。 – danportin