F#三参数中缀运算符



如何使用三参数中缀运算符?

例如:基本函数是let orElse labelFunc p1 p2 = {...}和操作员let ( <|> ) = orElse

现在,对于非中缀版本,这很好地工作:List.reduce ((<|>) labelFunc) parserList

我还能以某种方式使用它吗;内讧";?例如:(p1 (<|> labelFunc) p1)不起作用,也没有任何其他组合,除了在这里使用非中缀版本。

首先,我认为最好限制代码中使用的自定义运算符的数量,因为自定义运算符会使F#代码难以阅读。F#允许您定义自定义运算符,但它的设计并不是为了让这成为一种很好的体验——它对一些小型领域特定的语言(如语法分析器组合子(来说是有意义的,但对其他语言来说没有什么意义。

所以,虽然我不建议使用这个,但有一个奇怪的技巧可以用来写类似p1 (<op> l) p2的东西,那就是使<op>中缀,并用另外两个自定义运算符替换括号:

let (</) a b = a, b
let (/>) c d = c, d
let (!) f = f
1 </ !10 /> 2

这个示例只生成一个包含所有三个参数的元组,但如果您在</运算符中实现您的逻辑,它实际上会执行您想要的操作。但正如我所说,我不会这么做:-(。

我认为没有任何好的方法可以实现这一点。一旦有了带括号的表达式,它就不会被解析为运算符——即使1 (+) 1也不起作用。

最新更新