我最近發現\x -> f x x
的無點是join f
,並且想明白爲什麼。我從這裏開始:爲什麼` x - > f x x` =`加入f`?
join :: Monad m => m (m a) -> m a
然後因爲我不熟悉「函數monad」而被打敗了。有人能幫我解釋平等的類型派生嗎?
我最近發現\x -> f x x
的無點是join f
,並且想明白爲什麼。我從這裏開始:爲什麼` x - > f x x` =`加入f`?
join :: Monad m => m (m a) -> m a
然後因爲我不熟悉「函數monad」而被打敗了。有人能幫我解釋平等的類型派生嗎?
這是在類型級別Monad ((->) r)
的一個非常簡單的代數變換。注意我們專注於並簡化join
的類型。
join :: Monad m => m (m a) -> m a
join :: ((->) r) (((->) r) a) -> ((->) r) a -- Specializing
join :: (r -> (r -> a)) -> (r -> a) -- Infix
join :: (r -> r -> a) -> r -> a -- Simplifying
如果我們在join
類型替代x ->
爲m
,我們得到(x -> x -> a) -> x -> a
。如果我們應用f
(我假設爲x
和a
),我們得到x -> a
,這也是\x -> f x x
的類型。
這裏沒有深刻的見解,只是一個機械的解釋。
instance Monad ((->) r) where
f >>= k = \ r -> k (f r) r
其中加入定義爲
join f = f >>= id
代定義
join f = \x -> id (f x) x
= \x -> f x x