F# 三参数中缀运算符
F# three parameter infix operator
如何使用三参数中缀运算符?
例如:基函数是
let orElse labelFunc p1 p2 = {...}
和运算符 let ( <|> ) = orElse
现在,对于非中缀版本,这很好用:List.reduce ((<|>) labelFunc) parserList
。
我能以某种方式使用它仍然“中缀”吗?例如:(p1 (<|> labelFunc) p1)
和任何其他组合都不起作用,除了在这里也使用非中缀版本。
我不认为有什么好的方法可以做到这一点。一旦你有了带括号的表达式,它就不会被解析为运算符——即使 1 (+) 1
也不起作用。
首先,我认为最好限制您在代码中使用的自定义运算符的数量,因为自定义运算符会使 F# 代码难以阅读。 F# 允许您定义自定义运算符,但它并不是专门为打造出色体验而设计的 - 它对某些小型特定于领域的语言(如解析器组合器)有意义,但对其他语言意义不大。
所以,虽然我不建议使用这个,但有一个奇怪的技巧可以用来编写类似 p1 (<op> l) p2
的东西,即使 <op>
中缀并用两个括号替换更多自定义运算符:
let (</) a b = a, b
let (/>) c d = c, d
let (!) f = f
1 </ !10 /> 2
此示例仅生成一个包含所有三个参数的元组,但如果您在 </
运算符中实现您的逻辑,它实际上会执行您想要的操作。但正如我所说,我不会这样做 :-).
如何使用三参数中缀运算符?
例如:基函数是
let orElse labelFunc p1 p2 = {...}
和运算符 let ( <|> ) = orElse
现在,对于非中缀版本,这很好用:List.reduce ((<|>) labelFunc) parserList
。
我能以某种方式使用它仍然“中缀”吗?例如:(p1 (<|> labelFunc) p1)
和任何其他组合都不起作用,除了在这里也使用非中缀版本。
我不认为有什么好的方法可以做到这一点。一旦你有了带括号的表达式,它就不会被解析为运算符——即使 1 (+) 1
也不起作用。
首先,我认为最好限制您在代码中使用的自定义运算符的数量,因为自定义运算符会使 F# 代码难以阅读。 F# 允许您定义自定义运算符,但它并不是专门为打造出色体验而设计的 - 它对某些小型特定于领域的语言(如解析器组合器)有意义,但对其他语言意义不大。
所以,虽然我不建议使用这个,但有一个奇怪的技巧可以用来编写类似 p1 (<op> l) p2
的东西,即使 <op>
中缀并用两个括号替换更多自定义运算符:
let (</) a b = a, b
let (/>) c d = c, d
let (!) f = f
1 </ !10 /> 2
此示例仅生成一个包含所有三个参数的元组,但如果您在 </
运算符中实现您的逻辑,它实际上会执行您想要的操作。但正如我所说,我不会这样做 :-).