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

时间:2009-11-22 17:16:56

标签: haskell functional-programming

在Haskell中使用monadic表达式时,使用liftM(即使在中缀位置)对我来说通常看起来很不美观和冗长。

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

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

3 个答案:

答案 0 :(得分:6)

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

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

答案 1 :(得分:3)

我会考虑<$<<$liftM2<<<$liftM3)。

答案 2 :(得分:1)

由于liftM == fmap(.) == fmap功能(((->) r) Functor的实例),我建议隐藏(.) Prelude并定义:

import Prelude hiding ((.))
import Control.Monad.Instances () -- import Functor instance for functions

infixr 9 .    
(.) :: (Functor f) => (a -> b) -> (f a -> f b)
(.) = fmap

示例:

foo = (\x -> x ^ 2) . (\x -> x + 1)
(+1) . [1, 2, 3]
someIO =<< read . getLine -- more useful in do notation because of following
someIO . read =<< getLine -- equivalent to above but uses different instance