gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 16:16:51 24 4
gpt4 key购买 nike

所以我正在在线阅读 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 的一些基本知识。

最佳答案

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

将其转回表达式。

关于haskell - 部分应用的中缀运算符的困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28597013/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com