join
jest zdefiniowany wraz z bind
w celu spłaszczenia połączonej struktury danych w jedną strukturę.Czy istnieje jakaś intuicja do zrozumienia łączenia dwóch funkcji w Monadzie?
Od typ widoku systemowym, (+) 7 :: Num a => a -> a
można uznać jako Functor
, (+) :: Num a => a -> a -> a
można uznać jako Functor
z Functor
, jak się trochę intuicji o tym, a nie tylko polegać na systemie typu? Dlaczego join (+) 7 === 14
?
Mimo że możliwe jest uzyskanie końcowego wyniku poprzez ręczne przejście procesu wiązania funkcji, byłoby wspaniale, gdyby pewne intuicje zostały podane.
To jest z ćwiczeń 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' może być uważany za "Funktora" ... "proszę nie mówić takich rzeczy. '(7+)' nie jest funktorem, to tak, jakby powiedzieć, że atom węgla to diament. Funktorem jest '(Int ->)', tzn. Konstruktor typów, który przyjmuje typy i generuje funkcje z liczb do tego typu. – leftaroundabout
Dla funkcji, 'join f = \ a -> f a a'. Zatem 'join (+) = \ a -> a + a'. – AJFarmar
@leftaroundabout Czy nie jest '(+) 7 :: Num a => a -> a' functor w kategorii' Num'? – Kamel