Что означает ((->) t) в Haskell?

В Haskell, что означает ((- > ) t) в сигнатуре типа экземпляров? Например, у Functor, Applicative и Monad есть экземпляр по строкам:

Functor ((->) r)

Я не могу найти никакого объяснения того, что означает эта подпись типа, и она очень устойчива к поисковым системам.

Ответы

Ответ 1

-> - это конструктор типа infix. Вы можете сравнить его с : - конструктором значения infix для типа списка. Чтобы использовать только :, мы помещаем круглые скобки вокруг него, чтобы он стал приложением префиксной функции:

(:) a b совпадает с a : b

Аналогично, (->) a b совпадает с a -> b, тип функции от a до b.

(->) a - это частичное применение конструктора типов, и он сам является конструктором типа * -> *.

Вы можете считать его "конструктором типов функций из a". Например. (->) Int является конструктором типов функций из Int. Вы можете построить полный тип функции, передав ему следующий тип: (->) Int String - это тип функций от Int до String.

instance Functor (->) a является функтором с операцией fmap, преобразующей функцию a -> b в функцию a -> c. Вы можете сравнить его с аналогичным instance Functor (Either a), который отображает Either a b в Either a c, применяя аргумент fmap к значениям Right.

Ответ 2

Мы могли бы использовать лямбда-функции и инфиксные функции:

(->) a    =    \b ->  (->) a b  --pseudo-Haskell
(->) a    =    \b ->  a -> b    --pseudo-Haskell

так, прочитайте экземпляр как:

class Functor f where
   fmap :: (a->b) -> f a -> f b

instance Functor ((->)r) where
   fmap :: (a->b) -> f     a  -> f     b
         = (a->b) -> (->)r a  -> (->)r b   --pseudo-Haskell
         = (a->b) -> (r -> a) -> (r -> b)  --pseudo-Haskell

Ответ 3

Вы могли видеть это как набор типов r -> a, где r исправлено.

Функтор - это функция типа m, что означает, что для любого типа a у вас есть тип m a. Примерами являются Maybe, [] и (->) r. Последнее, должно быть, лучше записать (r ->), но я не знаю, разрешено ли это.