Я использую цитаты из F # для создания функции, которая проверяет, удовлетворяет ли один вход любому из нескольких случаев. То есть, функция whos body - это что-то вроде ... || ... || ...
, где число ||
s определяется во время выполнения. Несколько упрощена, что я сейчасСтроительная квартира котируемая лямбда
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 @>
)
Есть ли простой способ сглаживания первого выражения, чтобы сделать его похожим на второе?
Briliant. Спасибо. Это точно то, что я спросил. – torbonde