繁体   English   中英

对部分应用的中缀运算符的困惑

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM