有人可以解释为什么以下表示(<*>) 与(=<<)作品:
f <*> a = (\f' -> return . f' =<< a) =<< f
Run Code Online (Sandbox Code Playgroud)
这让我觉得这是一种刻意迟钝的写作方式.无论谁给你这个代码都试图搞砸你.这是通常的定义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)
你去吧
| 归档时间: |
|
| 查看次数: |
116 次 |
| 最近记录: |