Woj*_*Gac 2 monads haskell pointfree
我一直在调查使用>>=列表(当被视为monad时).在所有关于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
Run Code Online (Sandbox Code Playgroud)
我特别希望double函数以无点的方式编写.你能想到更简单的实现,double以便它仍然可以使用>>=吗?
Sassa NF return . (*2)既简短,又展示了一个有趣的原则.如果我们内联整个事情我们会得到
list >>= double
list >>= return . (*2)
Run Code Online (Sandbox Code Playgroud)
模式\f l -> l >>= return . f很常见,有自己的名字:liftM
liftM :: Monad m => (a -> b) -> m a -> m b
liftM f m = m >>= return . f
Run Code Online (Sandbox Code Playgroud)
事实上,liftM相当于fmap,通常map在引用列表时就已知:
list >>= return . (*2)
liftM (*2) list
fmap (*2) list
map (*2) list
Run Code Online (Sandbox Code Playgroud)