下記の完全なコード例(正常にコンパイルされたもの)は、私の問題の単純化されたやや工夫された例です。他の型をラップする型を表すWrapperインタフェース用の汎用ラップ関数を記述できますか?
NatPair
はNat
秒のペアである、と私は機能lift_binary_op_to_pair
を使用して「リフト」NatPair
点ごとにバイナリNum
操作、したいです。
を実装することはできません。NatPair
はデータコンストラクタではないためです。
だから、私はタイプWrappedNatPair
でそれをラップし、私は+
と*
の対応「持ち上げる」バージョンでは、そのタイプのNum
実装を提供することができます。
次に、Wrapper
インターフェイスを使用して、ラッパータイプのアイデアを一般化したいと考えています。
lift_natpair_bin_op_to_wrapped
機能はWrappedNatPair
にNatPair
からバイナリ操作を持ち上げることができ、実装コードはunwrap
と wrap
Wrapper
インタフェースメソッドの点で完全です。
しかし、私はエラーで、その後、型シグネチャもコンパイルされません
lift_bin_op_to_wrapped : Wrapper t => BinaryOp WrappedType -> BinaryOp t
に一般化しようとした場合:
`-- Wrapping.idr line 72 col 23:
When checking type of Main.lift_bin_op_to_wrapped:
Can't find implementation for Wrapper t
(エラーの場所が「の場所です。 ')。
私はこの問題は、t
がそうWrapperType
が インタフェース定義自体の内部以外の場所に起動することはできませんWrapper
インタフェースWrapperType
方法、 のためにどこでも 型シグネチャで表示されないということだと思います。
(回避策は耐え難いされていない、同じ実装コードop x y = wrap $ op (unwrap x) (unwrap y)
と定型lift_<wrapped>_bin_op_to_<wrapper>
方法を毎回書くことです。しかし、私は、私は一般的なlift_bin_op_to_wrapped
メソッドを書くことができない理由を明確に理解を持っていると思います。)
%default total
PairedType : (t : Type) -> Type
PairedType t = (t, t)
NatPair : Type
NatPair = PairedType Nat
data WrappedNatPair : Type where
MkWrappedNatPair : NatPair -> WrappedNatPair
equal_pair : t -> PairedType t
equal_pair x = (x, x)
BinaryOp : Type -> Type
BinaryOp t = t -> t -> t
lift_binary_op_to_pair : BinaryOp t -> BinaryOp (PairedType t)
lift_binary_op_to_pair op (x1, x2) (y1, y2) = (op x1 y1, op x2 y2)
interface Wrapper t where
WrappedType : Type
wrap : WrappedType -> t
unwrap : t -> WrappedType
Wrapper WrappedNatPair where
WrappedType = NatPair
wrap x = MkWrappedNatPair x
unwrap (MkWrappedNatPair x) = x
lift_natpair_bin_op_to_wrapped : BinaryOp NatPair -> BinaryOp WrappedNatPair
lift_natpair_bin_op_to_wrapped op x y = wrap $ op (unwrap x) (unwrap y)
Num WrappedNatPair where
(+) = lift_natpair_bin_op_to_wrapped (lift_binary_op_to_pair (+))
(*) = lift_natpair_bin_op_to_wrapped (lift_binary_op_to_pair (*))
fromInteger x = wrap $ equal_pair (fromInteger x)
WrappedNatPair_example : the WrappedNatPair 8 = (the WrappedNatPair 2) + (the WrappedNatPair 6)
WrappedNatPair_example = Refl
:正常にコンパイル
フルコード(プラットフォーム:Ubuntuの16.04実行イドリス1.1.1-gitの:83b1bed)を