Haskell 哈斯凯尔:可变一元提升函数

Haskell 哈斯凯尔:可变一元提升函数,haskell,functional-programming,monads,Haskell,Functional Programming,Monads,我是哈斯克尔的新手,我正在努力学习单子。我读过关于liftM2的书,我想知道你是否能把它变成可变的 一般来说,不能使用变量Haskell函数,因为采用不同参数数的函数具有非常不同的类型 但是,使用Control.Applicative中的运算符可以概括为liftM2,这可能会很有趣: liftM2 f a b = f <$> a <*> b liftM3 f a b c = f <$> a <*> b <*> c liftM4 f a

我是哈斯克尔的新手,我正在努力学习单子。我读过关于liftM2的书,我想知道你是否能把它变成可变的

一般来说,不能使用变量Haskell函数,因为采用不同参数数的函数具有非常不同的类型

但是,使用
Control.Applicative
中的运算符可以概括为
liftM2
,这可能会很有趣:

liftM2 f a b = f <$> a <*> b
liftM3 f a b c = f <$> a <*> b <*> c
liftM4 f a b c d = f <$> a <*> b <*> c <*> d
liftm2fab=fab
liftM3 f a b c=f a b c
liftM4 f a b c d=f a b c d
(从技术上讲,这仅适用于您的Monad也适用的情况,但从ghc 7.10开始,所有Monad都适用)


等等。通过这些类型了解这些表达式是如何工作的是值得的。

您的意思应该是
liftM2
liftM3
liftM4
。此外,您给出的定义是
liftA2
liftA3
liftA4
。如右图所示,我交换了
M
;从移动设备应答的危险。但是关于
liftA2
etc和
liftM2
之间的区别,这就是我对ghc7.10的评论的意思。AMP实现后,所有正确定义的单子都定义了与
liftA2
相同的
liftM2
,等等。尽管AMP生效,但
liftMn
功能仍在
base
中以单子形式实现;看,当然了。所以AMP要求在正确定义的单子中
()
ap
fmap
liftM
相同,并且您引用的定义等同于
liftM2 f a b=f`liftM`a`ap`b
liftM3 f a b=f`liftM`a`b`ap`c
,等等。