Автоматический неявный аргумент перестает работать, когда типу присваивается имя
При написании этого ответа я заметил, что пока все работает как положено:
onlyModBy5 : (n : Nat) -> {auto prf : n `modNat` 5 = 0} -> Nat
onlyModBy5 n = n
foo : Nat
foo = onlyModBy5 25
но как только я даю имя свойству, оно перестает работать:
Divides : Nat -> Nat -> Type
Divides n k = k `modNat` n = 0
onlyModBy5 : (n : Nat) -> {auto prf : 5 `Divides` n} -> Nat
onlyModBy5 n = n
foo : Nat
foo = onlyModBy5 25
сейчас заполняя auto
Arg терпит неудачу с
Can't find a value of type
Divides 5 25
Почему Идрис не может видеть сквозь Divides
определение?
1 ответ
Решение
Я не уверен, если это причина, но modNat не является полным. Это было бы хорошей причиной для поездки в Идрис.
divides : Nat -> Nat -> Nat
divides n k = n `modNat` k
onlyModBy5 : (n : Nat) -> {auto prf : n `divides` 5 = 0 } -> Nat
onlyModBy5 n = n
foo : Nat
foo = onlyModBy5 25
По некоторым причинам это уже терпит неудачу также (только косвенное обращение от оригинальной версии).