我想简化表达式if(x == 1 || x == 2)
我希望我可以写if(x == 1 or 2),但是没有语法。
其他可能性是使用Contains或Any方法,例如:if([1,2].Contains(x)),但这涉及不必要的调用。

我可以创建一些运算符来执行此操作吗?

我可以用Nemerle语言编写宏:

macro @|||(left, right)
  match (left)
    | <[ $x == $y ]> => <[ $x == $y || $x == $right ]>
    | _ => Message.Error("Error"); <[ ]>

然后用法:
if (x == 1 ||| 2) { .. }

我可以在F#中以这种方式创建运算符吗?

最佳答案

您可以使用|>来完成此任务,它是从haskell monoid实例之一的常见用法中借用的。

let appendResults f g = (fun x -> f(x) || g(x))
let f x = x=1
let g x = x=2
let inline (>>||) x y = (appendResults f g) x y
let x = 1
if(x |> (1 >>|| 2)) then printfn "true" else printfn "false"

对于任意数量的参数,只需模仿haskell的相关mconcat方法即可达到相同的效果,也许像这样:
let rec concatResults = function
| [] -> (fun x -> false)
| (x:xs) -> appendResults x (concatResults xs)

老实说,您最好只使用Contains。如果这样做有任何特殊的开销,我怀疑这真的很重要。

10-07 13:15
查看更多