F#中是否有任何语法允许按顺序通过一系列函数进行流水线操作?例如,
x |> fun1 |> fun2 |> fun3 ...
或者是否有设计模式使这项任务变得不必要?在我的情况下,我正在制作一个(天真的)数独求解器并且具有如下所示的函数:
let reduceByRows poss =
poss
|> reduceBy (rowIndeces 1) |> reduceBy (rowIndeces 2) |> reduceBy (rowIndeces 3)
|> reduceBy (rowIndeces 4) |> reduceBy (rowIndeces 5) |> reduceBy (rowIndeces 6)
|> reduceBy (rowIndeces 7) |> reduceBy (rowIndeces 8) |> reduceBy (rowIndeces 9)
有没有办法清理这样的东西?
答案 0 :(得分:8)
一种看待这种情况的方法是在流水线操作符|>
上折叠而不是折叠数据:
{1..9} |> Seq.map (rowIndices >> reduceBy)
|> Seq.fold (|>) poss
通常,如果fun1
,fun2
等具有相同的签名,您可以对一系列函数应用|>
,即重复流水线:< / p>
[
fun1;
fun2;
fun3;
//...
] |> List.fold (|>) x
答案 1 :(得分:7)
看起来像是我的折叠。
怎么样?let reduceByRows poss =
Seq.fold (fun p i -> reduceBy (rowIndices i) p) poss {1..9}