2016-07-15 6 views
4

\x -> f x xのフリークエンシーはjoin fであり、その理由を理解したいと最近知った。私はここから始めました:なぜ ` x - > f x x` =` join f`ですか?

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

私は "機能モナド"に慣れていないので、私はここから始めました。平等を説明する型の導出を助けてくれる人がいますか?

答えて

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の種類にmためx ->に置き換えた場合、我々は(x -> x -> a) -> x -> aを取得します。私たちがxaのタイプx -> x -> aと仮定してfを適用した場合、x -> aが得られます。このタイプは\x -> f x xです。

3

ここでは深い洞察はありませんが、機械的説明です。

join f = f >>= id 

置換定義

join f = \x -> id (f x) x 
     = \x -> f x x 
として定義される参加
instance Monad ((->) r) where 
    f >>= k = \ r -> k (f r) r 

関連する問題