Как я могу реализовать функцию typeOf?
Поскольку в Idris типы являются первоклассными, кажется, что я должен написать typeOf
функция, которая возвращает тип своего аргумента:
typeOf : a => a -> Type
typeOf x = a
Однако, когда я пытаюсь вызвать эту функцию, я получаю то, что выглядит как ошибка:
*example> typeOf 42
Can't find implementation for Integer
Как я могу правильно реализовать это typeOf
функционировать? Или есть что-то более тонкое в идее "получения типа значения", которое я упускаю, что предотвратило бы существование такой функции?
1 ответ
Запишите это так:
typeOf : {a : Type} -> a -> Type
typeOf {a} _ = a
a => b
является функцией, которая имеет неявный аргумент, заполненный разрешением интерфейса. {a : b} -> c
является функцией с неявным аргументом, заполненным объединением.
Здесь нет необходимости ссылаться на интерфейсы. Каждый термин имеет один тип. Если ты пишешь typeOf 42
неявное a
подразумевается Integer
путем объединения.