monadic绑定中的无点函数

时间:2014-02-19 14:13:11

标签: haskell monads pointfree

我一直在调查>>=与列表的使用情况(当被视为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实现,以便它仍然可以与>>=一起使用吗?

1 个答案:

答案 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