Haskell 一元结合中的无点函数

Haskell 一元结合中的无点函数,haskell,monads,pointfree,Haskell,Monads,Pointfree,我一直在研究>=与列表(当被视为单子时)的用法。在一篇文章中,我发现了列表的以下标识:l>=f=concatMap f l,其中l是一个列表,f是一些(一元)函数。我尝试了将列表中的每个元素加倍的简单示例,并得出以下结论: let double :: Int -> [Int] double = (flip (:) []) . (2*) let monadicCombination :: [Int] monadicCombination = [1,2,3,4,5] >&

我一直在研究
>=
与列表(当被视为单子时)的用法。在一篇文章中,我发现了列表的以下标识:
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
实现,以便它仍然可以与
>=
一起使用吗?

sassanf的
返回。(*2)
既简短又展示了示例的有趣原理。如果我们把整件事都写进去

list >>= double
list >>= return . (*2)
模式
\f l->l>>=返回。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

double=(:[])。(2*)
另外,
double=返回。(2*)
为了将来的参考,请试用
无点
软件包,它附带了一个
无点
可执行文件,可以为您减少代码片段。我所做的就是
pointfree“double x=[2*x]”
获取
double=return。(2*)
无点“double x=[x+x]”
获取
double=return。join(+)
@bheklir我的意思是
return
join
来自不同的单子,它们仍然刺痛我的眼睛。即使这并不罕见。@bheklillr,但
返回。(*2):(Monad m,Num b)=>b->mb
tooThanks以获取有用的额外见解,@J.Abrahamson