Pet*_*lys 1 haskell infix-notation
在Haskell中,中缀表示法允许我们执行以下操作:
divide :: Double -> Double -> Double
divide x y = x / y
foo = divide 10.0 3.0
bar = 10.0 `divide` 3.0 -- infix
-- foo and bar are equivalent
Run Code Online (Sandbox Code Playgroud)
是否可以使用/ define中缀表示法,左边有2个参数?
sumAndDivideBy :: Double -> Double -> Double -> Double
sumAndDivideBy x y z = (x + y) / z
foo2 = sumAndDivideBy 3.0 5.0 2.0
bar2 = 3.0 `sumAndDivideBy` 5.0 $ 2.0 -- works but not what I wan't
bar3 = 3.0 5.0 `sumAndDivideBy` 2.0 -- does not work - impossible?
Run Code Online (Sandbox Code Playgroud)
简短的回答是,不,你不能这样做.
据我所知,如果你有一个功能f :: x -> y -> z.然后你可以在表单中编写它的应用程序
f x0 y0
Run Code Online (Sandbox Code Playgroud)
要么
x0 `f` y0
Run Code Online (Sandbox Code Playgroud)
他们的意思完全相同.
在你的功能的情况下sumAndDivideBy :: Double -> Double -> Double -> Double,因为currying相当于Double -> (Double -> (Double -> Double))我们是完全明确的.让我以两者之间的形式写出来:
sumAndDivideBy :: Double -> Double -> (Double -> Double)
Run Code Online (Sandbox Code Playgroud)
这符合完全示意的形式我上面得到,与x和y等于Double和z到功能类型Double -> Double.这意味着您确实可以使用sumAndDivideBy中缀形式,就像您在示例的倒数第二行中所做的那样.通常,您可以使用超过2个参数的任何函数执行此操作,但"中缀"表单仅在第一个和第二个参数之间有效.
当然,由于再次进行curry,你可以意识到这sumAndDivideBy 3.0本身就是一个函数Double -> Double -> Double,你可以在中缀形式中使用,在你想要的完全相同的"位置".所以你可以这样做:
sumWithThreeAndDivide = sumAndDivideBy 3.0
foo = 5.0 `sumWithThreeAndDivide` 2.0
Run Code Online (Sandbox Code Playgroud)
但它确实需要为部分应用的函数定义一个名称,我猜这限制了你正在考虑的事情的用途.
我不确定你的目标究竟是什么,因为你的例子可以非常自然地呈现,并且divide你已经显示了它的功能,如
(3.0 + 5.0) `divide` 2.0
Run Code Online (Sandbox Code Playgroud)
或者,当然,既然divide是相同的(/),就像3.0 + 5.0 / 2.0我自然认为的那样.