Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell 为liftM发明合适的中缀运算符符号_Haskell_Functional Programming - Fatal编程技术网

Haskell 为liftM发明合适的中缀运算符符号

Haskell 为liftM发明合适的中缀运算符符号,haskell,functional-programming,Haskell,Functional Programming,在Haskell中处理一元表达式时,liftM的使用(即使在中缀位置)在我看来通常都是不美观和冗长的 大多数其他一元原语(>=,>)甚至是liftM的纯挂件$都是中缀运算符。这让我想到为什么一元提升没有操作符符号 对于操作员符号,您是否有合理、一致的建议(或者为什么不应该有)? (我想到了-和-您可以使用Control.Applicative中的操作符 编辑:不幸的是 只适用于一些应用程序的单元格。定义一些实例Maad M= >应用M< /代码>是不可能的,因为这将与现有的应用实例IO,可能和[

在Haskell中处理一元表达式时,
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和[]重叠。”
可能我没有得到它,但即使可以,您也不需要得到它,因为您已经有了这些类型的