join
wird zusammen mit bind
definiert, um die kombinierte Datenstruktur in eine einzelne Struktur zu reduzieren.Gibt es irgendeine Intuition, um zwei Funktionen in Monad zu verbinden?
Vom Typ Systemansicht, (+) 7 :: Num a => a -> a
als Functor
in Betracht gezogen werden könnte, (+) :: Num a => a -> a -> a
als Functor
von Functor
in Betracht gezogen werden könnte, wie eine Intuition es auf Typ-System nur unter Berufung statt zu bekommen? Warum join (+) 7 === 14
?
Obwohl es möglich ist, das Endergebnis durch manuelles Steigen durch den Funktionsbindungsvorgang zu erhalten, wäre es großartig, wenn eine Intuition gegeben wäre.
Dies ist von den NICTA Übungen.
-- | 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 'könnte als 'Functor' betrachtet werden ... bitte sag sowas nicht. '(7+)' ist kein Funktor, es ist, als würde man sagen, ein Kohlenstoffatom sei ein Diamant. Der Funktor ist '(Int ->)', d. H. Der Typkonstruktor, der Typen akzeptiert und Funktionen von Zahlen zu diesem Typ erzeugt. – leftaroundabout
Für Funktionen, 'Join f = \ a -> f a a'. Also 'verbinden (+) = \ a -> a + a'. – AJFarmar
@leftaroundabout Ist nicht '(+) 7 :: Num a => a -> a' ein Funktor in der Kategorie 'Num'? – Kamel