对部分应用的中缀运算符的混淆
Confusion on partially applied infix operators
所以我在网上阅读了 Haskell 指南,只是对中缀运算符和过滤器的组合感到好奇。
假设你有一个像
这样的函数
filter (>5) [6, 10, 5]
那将 return [6,10],这似乎是过滤器应该工作的直观方式。
然而,做
filter ((>) 5) [6, 10, 5]
returns 一个空列表(这仍然有意义,(>) 检查它的第一个参数是否大于第二个参数)。
但是,过滤器的定义通常类似于
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 指南,只是对中缀运算符和过滤器的组合感到好奇。
假设你有一个像
这样的函数filter (>5) [6, 10, 5]
那将 return [6,10],这似乎是过滤器应该工作的直观方式。
然而,做
filter ((>) 5) [6, 10, 5]
returns 一个空列表(这仍然有意义,(>) 检查它的第一个参数是否大于第二个参数)。
但是,过滤器的定义通常类似于
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`)
将其转回表达式。