join
與bind
一起定義以將組合數據結構扁平化爲單個結構。有沒有直覺瞭解Monad中的連接兩個函數?
從類型的系統視圖,(+) 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'可以被認爲是一個'Functor' ...」請不要說這樣的話。 '(7+)'不是一個函子,就像說碳原子是鑽石一樣。函子是'(Int - >)',即類型構造函數,它接受類型並從數字到該類型生成函數。 – leftaroundabout
對於函數,'join f = \ a - > f a a'。因此'join(+)= \ a - > a + a'。 – AJFarmar
@leftaroundabout不是'(+)7 :: Num a => a - > a'是類別'Num'上的函數嗎? – Kamel