最近我发现对于\x -> f x x
,它的pointfree形式是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
类型中用x ->
替换m
,则可以得到(x -> x -> a) -> x -> a
。如果我们将f
应用于该类型(假设它具有x -> x -> a
的类型,其中一些x
和a
),则我们得到x -> a
,这也是\x -> f x x
的类型。
这里没有深入的见解,只有一个机械的解释。
instance Monad ((->) r) where
f >>= k = \ r -> k (f r) r
join的定义如下:
join f = f >>= id
join f = \x -> id (f x) x
= \x -> f x x