4
はなぜ以下です。TypeCheckます:なぜ "mod"に関連する等価性がIdrisでタイプチェックでないのですか?
v1 : mod 3 2 = 1
v1 = Refl
しかし、これは罰金です。TypeCheckます:
v2 : 3 - 2 = 1
v2 = Refl
はなぜ以下です。TypeCheckます:なぜ "mod"に関連する等価性がIdrisでタイプチェックでないのですか?
v1 : mod 3 2 = 1
v1 = Refl
しかし、これは罰金です。TypeCheckます:
v2 : 3 - 2 = 1
v2 = Refl
それが原因mod
機能(@AntonTrunov明確化のおかげで)の不公平に発生します。それは多相であり、デフォルトで数値定数はInteger
です。 Integer
タイプmod
機能について
Idris> :t mod
mod : Integral ty => ty -> ty -> ty
Idris> :t 3
3 : Integer
Idris> :t mod 3 2
mod 3 2 : Integer
合計はありません。
代わりにmodNatNZ
機能を使用して、すべてのタイプのチェックが完璧で機能するようにします。
v1 : modNatNZ 3 2 SIsNotZ = 1
v1 = Refl
"コンパイルステージでIdrisがタイプでパターンマッチングしか実行できません"という文句は正しくありません。たとえば、 '(the Int 3)-2 = 1'を取ると、 'Int'は帰納的データ型ではありませんが、' Refl'を使ってそれを証明できます。 'Refl'が' mod'で動作しないのは、あなたがすでに説明したように、偏見です。 –