一元绑定中的无点函数



我一直在研究>>=与列表的用法(当被视为monads时)。在一篇关于monads的文章中,我发现了列表的以下恒等式:l >>= f = concatMap f l,其中l是一个列表,f是某个(一元)函数。我尝试了将列表的每个元素加倍的简单示例,并得出以下结果:

let double :: Int -> [Int]
    double = (flip (:) []) . (2*)
let monadicCombination :: [Int]
    monadicCombination = [1,2,3,4,5] >>= double

我特别希望double函数以无点的方式编写。你能想到更简单的double实现,以便它仍然可以与>>=一起使用吗?

Sassa NF 的return . (*2)既简短又演示了示例的一个有趣原则。如果我们内联整个事情,我们会得到

list >>= double
list >>= return . (*2)

模式f l -> l >>= return . f很常见,有自己的名字:liftM

liftM :: Monad m => (a -> b) -> m a -> m b
liftM f m = m >>= return . f

事实上,liftM相当于fmap,在引用列表时通常被称为map

list >>= return . (*2)
liftM (*2) list
fmap (*2) list
map (*2) list

最新更新