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