在Haskell中使用monadic表达式时,使用liftM
(即使在中缀位置)对我来说通常看起来很不美观和冗长。
大多数其他monadic原语(>>=
,>>
)甚至liftM
的纯粹的 $
都是中缀运算符。这让我想到为什么没有操作符号来进行monadic提升。
对于操作符号(或者为什么不应该有符号),您是否有合理,一致的建议?
(我想到了>-
和-<
(通过函数移动monad),但它们似乎在箭头的上下文中有不同的含义。)
答案 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