![](/img/trans.png)
[英]Is there a way to predict infix function behavior for partially applied functions in Haskell?
[英]Confusion on partially applied infix operators
因此,我在线阅读了一份Haskell指南,只是对中缀运算符和过滤器的结合感到好奇。
说你有一个像
filter (>5) [6, 10, 5]
这将返回[6,10],这似乎是直观的过滤器工作方式。
但是,这样做
filter ((>) 5) [6, 10, 5]
返回一个空列表(这仍然有意义,(>)检查其第一个参数是否大于第二个参数)。
但是,过滤器通常定义为
filter :: (a -> Bool) -> [a] -> [a]
filter _ [] = []
filter p (x:xs)
| p x = x : filter p xs
| otherwise = filter p xs
当类型系统知道其具有infix运算符时,是否编写了大多数infix运算符,以便部分应用的函数需要原始前缀函数的前导参数? 即是infix>定义为类似(屠宰语法)
infix> :: Int -> Int-> Bool
infix> x y = (>) y x
x infix> y = (>) x y
抱歉,如果这个问题没有道理,我觉得在p是部分应用的中缀运算符时,我对px的求值方式缺少基本知识。
(>5)
和((>) 5)
是两种不同类型的表达式。
首先是所谓的部分 。 节的形式为(op exp)
或(exp op)
,其中op是中缀运算符,而exp是另一个表达式。 一个节接受一个参数并将其应用于缺少的一侧,因此(>5) 4
= (4 > 5)
和(5>) 4
= (5 > 4)
。 换句话说, (>5)
等效于\\x -> x > 5
。
在((>) 5)
, (>)
是中缀运算符>
转换为表达式。 ((>) 5)
然后是函数(>)
的5
的应用,该函数提供了一个接受下一个参数的新函数。 如果应用该参数,例如(>) 5 4
,则得到的前缀等价于(5 > 4)
。
将infix运算符转换为可以使用前缀的表达式的方法适用于所有infix运算符。 您也可以采用另一种方法,将标识符隐蔽到一个中缀运算符中,即:
`foo`
您甚至可以说:
(`foo`)
将其转换为表达式。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.