3

При проверке типа, если id в Идрис, мы получаем то, что и следовало ожидать:Тип анонимной функции идентичности в Идриса

> :type id 
id : a -> a 

Однако проверка версии лямбда-выражения бросает сложную ошибку:

> :type \x => x 
(input):Incomplete term \x => x 

Почему это? Если я использую функцию, чтобы принуждать контекст x к типу, я получаю то, что я бы ожидать:

> :type \x => x+1 
\x => x + 1 : Integer -> Integer 
+1

Не является ли это просто потому, что Идрис не имеет логического вывода типа для функций? – Cactus

ответ

3

Тип умозаключение, в общем, является неразрешимым для зависимых типов, смотри, например, 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