То, чего вы хотите достичь, невозможно. Если вы посмотрите на тип unwrap : (a1 : Type ** b1 : Type ** Arrow a b) -> Arrow a b
, то увидите, что он использует тип данных, отличный от (a : Type ** b : Type ** Arrow a b)
. Это связано с тем, что аргументы a
, b
заранее определены количественно - задается результирующий тип (который также отличается от случая REPL; там вы не привязаны к аргументам). Так что с :set showimplicit
это
Main.unwrap : {b : Type} -> {a : Type} ->
(a1 : Type ** b1 : Type ** Main.Arrow a b) ->
Main.Arrow a b
Это то, что относится к зависимым парам, вы не можете их легко ограничить. Взгляните на Vect.filter : (elem -> Bool) -> Vect len elem -> (p : Nat ** Vect p elem)
- если бы у нас была такая функция, как unwrap : (p : Nat ** Vect p elem) -> Vect p elem
, нам бы не понадобилась зависимая пара.
Вместо этого функция, которая будет вызывать unwrap
, должна будет проверить p
и затем обработать Vect
соответственно. К сожалению, мы не можем легко проверить типы (по крайней мере, если вы хотите обобщить для всех типов). Так что ваш лучший выбор: не используйте зависимые типы здесь.