Ответ 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
.