为什么`\x -> f x x`等于`join f`?

4

最近我发现对于\x -> f x x,它的pointfree形式是join f,并且想要理解为什么会这样。我从下面开始:

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

我遇到了困难,因为我不熟悉“函数单子”。能否有人帮助我通过类型推导来解释相等性?

3个回答

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应用于该类型(假设它具有x -> x -> a的类型,其中一些xa),则我们得到x -> a,这也是\x -> f x x的类型。


3

这里没有深入的见解,只有一个机械的解释。

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接