join
определяется вместе с bind
для сглаживания объединенной структуры данных в единую структуру.
С точки зрения системы типов (+) 7 :: Num a => a -> a
можно рассматривать как Functor
, (+) :: Num a => a -> a -> a
можно рассматривать как Functor
из Functor
, как получить некоторую интуицию по этому поводу вместо того, чтобы просто полагаться на систему типов? Почему join (+) 7 === 14
?
Несмотря на то, что можно получить окончательный результат путем ручного пошагового выполнения процесса привязки функции, было бы здорово, если бы была дана некоторая интуиция.
Это из упражнений NICTA.
-- | Binds a function on the reader ((->) t).
--
-- >>> ((*) =<< (+10)) 7
-- 119
instance Bind ((->) t) where
(=<<) ::
(a -> ((->) t b))
-> ((->) t a)
-> ((->) t b)
(f =<< a) t =
f (a t) t
-- | Flattens a combined structure to a single structure.
--
-- >>> join (+) 7
-- 14
join ::
Bind f =>
f (f a)
-> f a
join f =
id =<< f
*Course.State> :t join (+)
join (+) :: Num a => a -> a
*Course.State> :t join
join :: Bind f => f (f a) -> f a
*Course.State> :t (+)
(+) :: Num a => a -> a -> a
(+) 7 :: Num a => a -> a
можно рассматривать как _2 _...», пожалуйста, не говорите так.(7+)
- это не функтор, это все равно что сказать, что атом углерода - это алмаз. Функтором является(Int ->)
, то есть конструктор типа, который принимает типы и генерирует функции из чисел в этот тип. - person leftaroundabout   schedule 01.09.2015join f = \a -> f a a
. Таким образомjoin (+) = \a -> a + a
. - person AJF   schedule 01.09.2015(+) 7 :: Num a => a -> a
не является функтором категорииNum
? - person Kamel   schedule 01.09.2015Num
как категория? Фух, посмотрим. Его объектами будут числовые типыn, m, ...
. Морфизмами будут функцииn -> m
и т. Д. Итак,(7+)
берет числовой тип и отображает его ... себе, достаточно справедливо. Но как он отображает морфизмы? Нет, боюсь, в этом нет никакого смысла. - person leftaroundabout   schedule 01.09.2015(+7)
отображает морфизмы числового типа на другие морфизмы числового типа, например(+1)
на(+8)
. Все функторы в Haskell отображают категорию в себя. - person Kamel   schedule 01.09.2015:k * -> *
? - person Kamel   schedule 02.09.2015* -> *
- это отличительная черта любого функтора Haskell. Под функтором функции я имею в виду функторы формы(A -> )
, то есть семейство функторов, которые определеныinstance Functor ((->) a)
. - person leftaroundabout   schedule 02.09.2015