Я использую кавычки в F# для создания функции, которая проверяет, удовлетворяет ли один ввод любому из множества случаев. То есть функция, тело которой похоже на ... || ... || ...
, где количество ||
определяется во время выполнения. Несколько упрощенно, что у меня сейчас есть
let vals = [|1..3|]
let currentfilter =
vals
|> Array.fold (fun acc i ->
<@ fun j -> (%acc) j || j = i @>)
<@ fun _ -> false @>
который генерирует дерево
val currentfilter : Expr<(int -> bool)> =
Lambda (j,
IfThenElse (Application (Lambda (j,
IfThenElse (Application (Lambda (j,
IfThenElse (Application (Lambda (_arg1,
Value (false)),
j),
Value (true),
Call (None,
op_Equality,
[j,
Value (1)]))),
j),
Value (true),
Call (None, op_Equality,
[j, Value (2)]))), j),
Value (true), Call (None, op_Equality, [j, Value (3)])))
Оптимально то, что я хочу создать, больше похоже на
Lambda (j,
IfThenElse (IfThenElse (Call (None, op_Equality, [j, Value (1)]),
Value (true),
Call (None, op_Equality, [j, Value (2)])),
Value (true), Call (None, op_Equality, [j, Value (3)])))
(Это было создано <@ fun j -> j = 1 || j = 2 || j = 3 @>
)
Есть ли простой способ сгладить первое выражение, чтобы оно больше походило на второе?