如何在Haskell中使用(= <<)编写(<*>)

mat*_*ias 2 monads haskell

有人可以解释为什么以下表示(<*>)(=<<)作品:

f <*> a = (\f' -> return . f' =<< a) =<< f
Run Code Online (Sandbox Code Playgroud)

Ben*_*son 8

这让我觉得这是一种刻意迟钝的写作方式.无论谁给你这个代码都试图搞砸你.这是通常的定义ap,它清晰易懂:

ap f a = do
    f' <- f
    a' <- a
    return (f' a')
Run Code Online (Sandbox Code Playgroud)

我们可以通过通常的dodesugaring转换来执行此操作,替换<->>=:

ap f a =
    f >>= \f' ->
    a >>= \a' ->
    return (f' a')
Run Code Online (Sandbox Code Playgroud)

现在,请注意最里面的术语\a' -> return (f' a'),可以写成return . f'.

ap f a =
    f >>= \f' ->
    a >>= return . f'
Run Code Online (Sandbox Code Playgroud)

然后,因为(=<<) = flip (>>=),我们可以更换>>=使用=<<通过交换的参数:

ap f a = f >>= (\f' -> return . f' =<< a)  -- reverse inner bind
ap f a = (\f' -> return . f' =<< a) =<< f  -- reverse the other bind
Run Code Online (Sandbox Code Playgroud)

你去吧