#idris
Вопрос:
Я столкнулся с ошибкой компиляции в Idris2, которую не могу объяснить, экспериментируя с монадами состояния Хоара:
data PostS : (valType : Type) -> (stateType : Type) -> (valType -> stateType -> Type) -> Type where
MkPostS
: (val : valType)
-> (outState : stateType)
-> {auto 0 prf : prop val outState}
-> PostS valType stateType prop
mkPost : Nat -> PostS Nat Nat Equal
mkPost s2 = MkPostS s2 s2
f : (s1 : Nat) -> {auto 0 prf : Equal 0 s1} -> PostS Nat Nat (Equal)
f inState {prf} = MkPostS 7 7
компилятор жалуется , что он не может унифицировать inState
и 7
в правой части f
, что действительно не должно быть в состоянии сделать, но я бы тоже не ожидал, что он попытается.
Странная часть заключается в том, что замена правой части f
на с mkPost 7
компилируется без ошибок, как и при использовании аналогичной лямбда-функции. Я в недоумении по поводу того, что здесь происходит.
ПРАВКА: еще несколько экспериментов
как отмечает @joel
f : PostS Nat Nat (Equal)
f = MkPostS 7 7
Также терпит неудачу, пытаясь объединить 7 и 0, аналогично, определяя
seven : Nat
seven = 7
имеет тот же результат, но:
f' : (s1 : Nat) -> PostS Nat Nat (n => Equal (s1 n))
f' s1 = MkPostS 7 (s1 7)
работает. Это изначально заставило меня поверить , что это проблема, связанная с неоднозначностью типа 7
, но нет:
data Foo = Bar | Baz
f'' : PostS Foo Foo (Equal)
f'' = MkPostS Baz Baz
Работает, объединяется Baz
с Baz
и пытается объединить Bar
и Baz
терпит неудачу , как и ожидалось, но MkPostS Bar Bar
приводит к «Несоответствию между: База и бар», которое также исчезает при указании {prf=Refl}
.
Я начинаю верить, что в компиляторе/проверке типов есть ошибка.
Комментарии:
1. любопытно, что если я удалю
s1
параметр изf
, я получу «Несоответствие между: 0 и 7».2. он компилируется, если я добавлю
{prf=Refl}
MkPostS
вf
, но я бы ожидал, что Идрис сделает вывод, что3. Ах, да, MyHoareMonad действительно не нужен, только что понял это сам. Отредактирует сообщение.