Haskell 为liftM发明合适的中缀运算符符号
在Haskell中处理一元表达式时,Haskell 为liftM发明合适的中缀运算符符号,haskell,functional-programming,Haskell,Functional Programming,在Haskell中处理一元表达式时,liftM的使用(即使在中缀位置)在我看来通常都是不美观和冗长的 大多数其他一元原语(>=,>)甚至是liftM的纯挂件$都是中缀运算符。这让我想到为什么一元提升没有操作符符号 对于操作员符号,您是否有合理、一致的建议(或者为什么不应该有)? (我想到了-和-您可以使用Control.Applicative中的操作符 编辑:不幸的是 只适用于一些应用程序的单元格。定义一些实例Maad M= >应用M< /代码>是不可能的,因为这将与现有的应用实例IO,可能和[
liftM
的使用(即使在中缀位置)在我看来通常都是不美观和冗长的
大多数其他一元原语(>=
,>
)甚至是liftM
的纯挂件$
都是中缀运算符。这让我想到为什么一元提升没有操作符符号
对于操作员符号,您是否有合理、一致的建议(或者为什么不应该有)?
(我想到了-
和-您可以使用Control.Applicative中的
操作符
<>编辑:不幸的是<代码> <代码>只适用于一些应用程序的单元格。定义一些<代码>实例Maad M= >应用M< /代码>是不可能的,因为这将与现有的应用实例IO,可能和[]][/P>< P>重叠,因为我认为“代码> > LIFTM==FMAP和<代码>。==fmap
对于函数((->)r
函数的实例
),我建议从前奏中隐藏()
,并定义:
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
foo=(\x->x^2)。(\x->x+1)
(+1) . [1, 2, 3]
someIO=所有monad都是applicative。为monad创建applicative实例非常简单,只需声明af=a>=(return.f)
和()=ap
。顺便说一句,(liftm2f)xy
相当于fxy
。liftM3
等也一样。只需继续添加
“不可能定义某些实例Monad m=>Applicative m,因为这将与现有的应用程序实例IO、Maybe和[]重叠。”
可能我没有得到它,但即使可以,您也不需要得到它,因为您已经有了这些类型的
。