部分应用的中缀运营商的困惑

Sae*_*eas 3 haskell

所以我在线阅读Haskell指南,并对中缀运算符和过滤器的组合感到好奇.

假设你有类似的功能

filter (>5) [6, 10, 5]
Run Code Online (Sandbox Code Playgroud)

这将返回[6,10],这似乎是过滤器应该工作的直观方式.

但是,干嘛

filter ((>) 5) [6, 10, 5]
Run Code Online (Sandbox Code Playgroud)

返回一个空列表(这仍然有意义,(>)检查它的第一个参数是否大于第二个参数).

但是,过滤器通常定义为

filter :: (a -> Bool) -> [a] -> [a]  
filter _ [] = []  
filter p (x:xs)   
    | p x       = x : filter p xs  
    | otherwise = filter p xs
Run Code Online (Sandbox Code Playgroud)

当类型系统知道它有一个中缀运算符时,是否大多数中缀运算符被写入,以便部分应用的函数需要原始前缀函数的前导参数?ie是infix>定义为类似的东西(butchered syntax)

infix> :: Int -> Int-> Bool
infix> x y = (>) y x
x infix> y = (>) x y
Run Code Online (Sandbox Code Playgroud)

很抱歉,如果这个问题没有意义,我觉得当p是部分应用的中缀运算符时,我遗漏了一些基本的px评估方法.

Rei*_*chs 10

(>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).

将中缀运算符转换为可以使用的表达式前缀适用于所有中缀运算符.您也可以采用其他方式将标识符转换为中缀运算符,即:

`foo`
Run Code Online (Sandbox Code Playgroud)

你甚至可以说:

(`foo`)
Run Code Online (Sandbox Code Playgroud)

把它变回表达式.

  • 谢谢.这为我解决了混乱的根源.所以这些部分基本上是语法便利结构,它们将参数映射到中缀运算符的正确边? (3认同)