インターフェイスで制約された型の関数を作成したいと思います。私の目的は、VerifiedMonoid
をClasses.Verified
のcontribパッケージから定義して、単純なモノイドソルバーを構築することです。Idrisインターフェイスで関数型を制約する
eval : VerifiedMonoid a => Expr n -> Env a n -> a
私は愚かな何かをするか、何かが欠けています:eval
の型シグネチャのため
Monoid-prover.idr line 29 col 5:
When checking type of MonoidProver.eval:
Can't find implementation for VerifiedMonoid a
:
イドリスは私に次のエラーを与えますか?そのような制約付きの型(evalの型のような)は、Haskellの型のように解釈できますか?
完全なコードを以下に示します。
module MonoidProver
import Classes.Verified
import Data.Fin
import Data.Vect
%default total
infixl 5 :+:
data Expr : Nat -> Type where
Var : Fin n -> Expr n
Id : Expr n
(:+:) : Expr n -> Expr n -> Expr n
Env : VerifiedMonoid a => (a : Type) -> Nat -> Type
Env a n = Vect n a
eval : VerifiedMonoid a => Expr n -> Env a n -> a
eval (Var i) env = index i env
eval Id env = neutral
eval (e :+: e') env = eval e env <+> eval e' env
私はあなたのタイプ署名が 'a'を間違ってスコープしていると思います。あなたが与えたタイプは' Env:VerifiedMonoid a =>(b:タイプ) - > Nat-> Type'に相当します。また、 'Env'の' VerifiedMonoid'制約はあなたを買うはずのものは何ですか? 'Env'の署名から削除すると、あなたのコードが型チェックされます。 – Cactus