Тип умозаключение, в общем, является неразрешимым для зависимых типов, смотри, например, the answers to this CS.SE question. В Идрисе вы можете обойтись без указания типов для некоторых терминов, но не для всех.
Если добавить определение к .idr
файлу и попробуйте загрузить его, как
myId = \x => x
вы получите сообщение информативной ошибки
No type declaration for Main.myId
Итак, давайте посмотрим, как далеко мы должны идти (ниже, с Идрисом 0.10.2):
myId : _
myId = \x => x
When checking right hand side of myId
with expected type iType
Type mismatch between _ -> _
(Type of \x => x
) and iType
(Expected type)
ОК, давайте попробуем тип функции:
myId : _ -> _
myId = \x => x
When checking right hand side of myId
with expected type ty -> hole
Type mismatch between ty
(Type of x
) and hole
(Expected type)
Я избавлю вас последующие шаги, но в основном myId : {a : Type} -> a -> _
и myId : {a : Type} -> _ -> a
как провалить точно так же, оставив нас с
myId : {a : _} -> a -> a
myId = \x => x
Поэтому нам нужно было указать полный тип myId
, за исключением уровня юниверса переменной типа a
.
Окончательный вариант типа подписи myId
«s также может быть записана в виде
myId : a -> a
myId = \x => x
Не является ли это просто потому, что Идрис не имеет логического вывода типа для функций? – Cactus