所以我在线阅读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)
把它变回表达式.
| 归档时间: |
|
| 查看次数: |
148 次 |
| 最近记录: |