我一直在研究>>=
与列表的用法(当被视为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