5

関数のリストを簡潔に順番にパイプライン化できる構文は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)

このようなものをクリーンアップする方法はありますか?

4

2 に答える 2

8

|>これを確認する1つの方法は、データを折りたたむ代わりに、パイプライン演算子を折りたたむことです。

{1..9} |> Seq.map (rowIndices >> reduceBy)
       |> Seq.fold (|>) poss

一般に、、、などが同じシグネチャを持っている場合fun1fun2|>一連の関数に適用できます。つまり、パイプライン処理を繰り返します。

  [
   fun1; 
   fun2; 
   fun3;
   //...
         ] |> List.fold (|>) x
于 2012-11-16T17:59:09.267 に答える
7

私には折り目のように見えます。どうですか

let reduceByRows poss = 
  Seq.fold (fun p i -> reduceBy (rowIndices i) p) poss {1..9}
于 2012-11-16T17:23:04.833 に答える