私は第8章Ididrisによるタイプドリブン開発を進めており、リライトとReflとのやりとりに関する質問があります。 plusCommutative 1 k
が1 + k
のすべてのインスタンスを探し、k + 1
と交換しますReflのリライトを使用して
myReverse : Vect n elem -> Vect n elem
myReverse [] = []
myReverse {n = S k} (x :: xs)
= let result = myReverse xs ++ [x] in
rewrite plusCommutative 1 k in result
:
このコードは、表現上の作品を書き換え方法の例として示されています。
私の質問には回答された状態でmyPlusCommutes
としてexerciesの一部としてplusCommutative
を書き換えるには、この解決策である。なぜなら何から
myPlusCommutes Z m = rewrite plusZeroRightNeutral m in Refl
:私はこのラインでトラブルを抱えています
myPlusCommutes : (n : Nat) -> (m : Nat) -> n + m = m + n
myPlusCommutes Z m = rewrite plusZeroRightNeutral m in Refl
myPlusCommutes (S k) m = rewrite myPlusCommutes k m in
rewrite plusSuccRightSucc m k in Refl
私はそのような行でそれ自身でReflを使って理解することができます:
myPlusCommutes Z m = Refl
私はこのエラーを取得する:
When checking right hand side of myPlusCommutes with expected type
0 + m = m + 0
Type mismatch between
plus m 0 = plus m 0 (Type of Refl)
and
m = plus m 0 (Expected type)
Specifically:
Type mismatch between
plus m 0
and
m
まず第一に、私は実現しなかった一つのことは、REFLが=
の右側から動作し、その方向からの反射を求めて表示されていることです。
次に、plus m 0 = plus m 0
からm = plus m 0
に変化REFL結果を書き換え、左からの書き換えが、最初の交換後に停止し、私が持っていると同じように、これまでm
でplus m 0
のすべてのインスタンスを置き換えるためにするようつもりはないように思わ期待される。
最終的には、これが私の質問です。なぜ書き換えがそのような振る舞いをするのですか?等価型の書き換えは異なりますか?その場合は、=
の左側に置き換えて書き換えますか?
λΠ> :set showimplicits
λΠ> :t Refl
Refl : {A : Type} -> {x : A} -> (=) {A = A} {B = A} x x
イドリスは、コンテキストからの情報を使用して用語Refl
にタイプを帰しようとしていることを意味し: