Функтор - это интерфейс. В Idris реализации ограничены данными или конструкторами типов, т.е. определены с помощью ключевого слова data
. Я не эксперт в зависимых типах, но я считаю, что это ограничение требуется - практически, по крайней мере - для системы звукового интерфейса.
Когда вы спрашиваете тип \a => Integer -> a
в REPL, вы получаете
\a => Integer -> a : Type -> Type
В Haskell мы считаем, что это настоящий конструктор типов, который можно превратить в экземпляр классов типов, таких как Functor
. Однако в Idris (->)
не является конструктором типов, а связывателем .
Самым близким к вашему примеру в Идрисе будет
((*3) `map` Mor (+100)) `applyMor` 1
с использованием модуля Data.morphisms . Или шаг за шагом:
import Data.Morphisms
f : Morphism Integer Integer
f = Mor (+100)
g : Morphism Integer Integer
g = (*3) `map` f
result : Integer
result = g `applyMor` 1
Это работает, потому что Morphism
- это конструктор реального типа с реализацией Functor
, определенной в библиотеке.