我一直在调查>>=
与列表的使用情况(当被视为monad时)。在文章All about 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
实现,以便它仍然可以与>>=
一起使用吗?
答案 0 :(得分:8)
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