2016-07-15 59 views
4

我最近發現\x -> f x x的無點是join f,並且想明白爲什麼。我從這裏開始:爲什麼` x - > f x x` =`加入f`?

join :: Monad m => m (m a) -> m a 

然後因爲我不熟悉「函數monad」而被打敗了。有人能幫我解釋平等的類型派生嗎?

回答

6

這是在類型級別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 
3

如果我們在join類型替代x ->m,我們得到(x -> x -> a) -> x -> a。如果我們應用f(我假設爲xa),我們得到x -> a,這也是\x -> f x x的類型。

3

這裏沒有深刻的見解,只是一個機械的解釋。

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 
相關問題