Скажем, у меня есть тип данных:Восстановление типа в Идриса
data Term : Type -> Type where
Id : Term (a -> a)
...
App : Term (a -> b) -> Term a -> Term b
с доказательством чего-либо App
:
data So : Bool -> Type where
Oh : So True
isApp : Term a -> Bool
isApp (App x y) = True
isApp x = False
Можно ли написать функцию, которая получает первый аргумент App
? Я не знаю, как бы я напечатал, так как исходный аргумент тип теряется:
getFn : (x : Term b) -> So (isApp x) -> ???
getFn (App f v) p = f
я мог держать тег внутри Term
с указанием того, какие типов были применены к нему, но тогда я должен был бы чтобы ограничить себя тегами. Раньше я предполагал, что это единственный вариант, но так много волшебных вещей, похоже, происходит в стране зависимых типов, которые, как я думал, я бы спросил сначала.
(примеры Agda бы приветствовать, как хорошо, хотя я предпочел бы Идрис те!)
Это было бы почти идентично. Вы можете ввести импликации в область видимости так же, как в Agda: GetFn (App {a} {b} f x) = Term (a -> b) –