我想简化表达式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。如果这样做有任何特殊的开销,我怀疑这真的很重要。