F # трехпараметрический инфиксный оператор - PullRequest
2 голосов
/ 13 июля 2020

Как использовать трехпараметрический инфиксный оператор?

Например: базовая функция - let orElse labelFunc p1 p2 = {...} и оператор let ( <|> ) = orElse

Теперь, для неинфиксной версии это прекрасно работает: List.reduce ((<|>) labelFunc) parserList.

Можно еще как-нибудь "инфиксировать"? например: (p1 (<|> labelFunc) p1) не работает, ни какая-либо другая комбинация, кроме использования здесь неинфиксной версии.

Ответы [ 2 ]

2 голосов
/ 14 июля 2020

Прежде всего, я считаю, что лучше всего ограничить количество пользовательских операторов, которые вы используете в своем коде, потому что пользовательские операторы затрудняют чтение кода F #. F # позволяет вам определять пользовательские операторы, но он специально не предназначен для того, чтобы сделать это удобным - это имеет смысл для некоторых небольших c языков, специфичных для домена (например, комбинаторов синтаксического анализатора), но не более того.

Итак , хотя я не рекомендую использовать это, есть странный трюк, который вы можете использовать для написания чего-то вроде p1 (<op> l) p2, который заключается в создании инфиксного <op> и замене круглых скобок еще двумя настраиваемыми операторами:

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

1 </ !10 /> 2

Этот пример просто создает кортеж со всеми тремя аргументами, но если вы реализуете свой logi c в операторе </, он фактически сделает что-то вроде того, что вы хотите. Но как я уже сказал, я бы не стал этого делать: -).

0 голосов
/ 13 июля 2020

Я не верю, что есть хороший способ добиться этого. Если у вас есть выражение в скобках, оно не будет анализироваться как оператор - даже 1 (+) 1 не работает.

...