\x -> f x x
のフリークエンシーはjoin f
であり、その理由を理解したいと最近知った。私はここから始めました:なぜ ` x - > f x x` =` join f`ですか?
join :: Monad m => m (m a) -> m a
私は "機能モナド"に慣れていないので、私はここから始めました。平等を説明する型の導出を助けてくれる人がいますか?
\x -> f x x
のフリークエンシーはjoin f
であり、その理由を理解したいと最近知った。私はここから始めました:なぜ ` x - > f x x` =` join f`ですか?
join :: Monad m => m (m a) -> m a
私は "機能モナド"に慣れていないので、私はここから始めました。平等を説明する型の導出を助けてくれる人がいますか?
これは、タイプレベルで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
の種類にm
ためx ->
に置き換えた場合、我々は(x -> x -> a) -> x -> a
を取得します。私たちがx
とa
のタイプx -> x -> a
と仮定してf
を適用した場合、x -> a
が得られます。このタイプは\x -> f x x
です。
ここでは深い洞察はありませんが、機械的説明です。
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