为liftM创建合适的中缀运算符符号

Dar*_*rio 4 haskell functional-programming

在Haskell中使用monadic表达式时,使用liftM's(甚至在中缀位置)对我来说通常看起来非常不美观和冗长.

大多数其他monadic原语(>>=,>>)甚至liftM纯粹的链接 $都是中缀运算符.这让我想到为什么monadic提升没有操作符号.

对于操作符号(或者为什么不应该有符号),您是否有合理,一致的建议?(我想的>--<(通过函数移位单子),但它们似乎在箭头的上下文不同的含义.)

Lon*_*ong 6

您可以使用<$>Control.Applicative中的运算符.

编辑:不幸的是<$>只适用于一些作为Applicative实例的Monads.定义一些instance Monad m => Applicative m是不可能的,因为这将与现有的Applicative实例IO,Maybe和[]重叠.

  • 所有单子都适用.为monad创建Applicative的实例就像声明`a <$> f = a >> =(return.f)`和`(<*>)= ap`一样简单. (3认同)
  • 顺便说一句,`(liftM2 f)xy`相当于`f <$> x <*> y`.同样适用于"liftM3"等.只需添加"<*>"即可. (3认同)