【问题标题】:Confusion on partially applied infix operators对部分应用的中缀运算符的困惑
【发布时间】:2015-02-19 01:07:10
【问题描述】:

所以我在网上阅读 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> :: Int -> Int-> Bool
infix> x y = (>) y x
x infix> y = (>) x y

对不起,如果这个问题没有意义,我觉得当 p 是一个部分应用的中缀运算符时,我错过了如何评估 p x 的一些基本内容。

【问题讨论】:

    标签: haskell


    【解决方案1】:

    (>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`
    

    你甚至可以说:

    (`foo`)
    

    把它变成一个表达式。

    【讨论】:

    • 谢谢。这为我消除了困惑的根源。所以节本质上是语法便利结构,将参数映射到中缀运算符的正确一侧?
    猜你喜欢
    • 2020-05-19
    • 2011-06-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多