2016-03-31 7 views
10

入れ子のfor-loopsをより機能的なスタイルに変換しようとしています。F# - ネストされたfor-loopsを機能的なスタイルに変換する

私はパイプライン処理、シーケンス、および配列を使いこなしてきましたが、無駄です。

let allCarrierCodes = new List<string>()  
for result in getAllCarrierCodesResults do 
     for carrierCode in result do 
      allCarrierCodes.Add(carrierCode.ToString()) 
  • getAllCarrierCodesResultsは「OBJリスト」

ネストされたループを再書き込みするための良い機能的な方法は何種類の配列である:ここで

は、私が持っている何ですか?

ありがとうございました。

+0

:-)追加ボーナスのために、より機能的に見えました不変です。それはパターンマッチングのようなF#グッズにアクセスできるようにします。 Leeの答えは以下のようになります。 'let allCodes = getAllCarriesCodes |> Seq.concat |> Seq.map string |> List.ofSeq' –

答えて

10

あなたはSeq.collectを使用することができます。

let allCodes = Seq.collect id getAllCarrierCodesResults 
       |> Seq.map string) 

または

let allCodes = Seq.collect (Seq.map string) getAllCarrierCodesResults 

あなたは、あなたがしたい具体的なコレクションに結果seq<string>を変換することができます。

+0

' Seq.collect id'を書くのではなく、 'Seq.concat' 。 –

+0

また、[コンストラクタがファーストクラスの関数として使用できる] F#4の新機能を使用することもできます(https://github.com/fsharp/FSharpLangDesign/blob/master/FSharp-4.0/ClassNamesAsFunctionsDesignAndSpec)。 md)。これで、 'let allCodes = getAllCarriesCodes |> Seq.concat |> Seq.map string |> List'と書くことができます。リストの使用については、上記の私のコメントを参照してください。 –

8

李氏の答えは、これよりも良いですが、私はちょうどあなたが完全にちょうどリスト内包の内側に、それらのネストされたループを置くことができることを言及したかった、と出来上がり:

let allCarrierCodes = 
    [for result in getAllCarrierCodesResults do 
    for carrierCode in result do 
     yield carrierCode.ToString()] 

が不可欠っぽいのようなものを見えるが、あります本当に機能的です。

また、あなたはcarrierCode.ToString()の代わりにstring carrierCodeを使用する必要があります。 NREからあなたを保護し、別に、F#のリストに「ノーマル」リスト( `System.Collections.Generic.List`)からの切り替えを検討し、ネストされたループを再書き込みから

+0

'.ToString()'を使用しないことについて助言したら、なぜそれをあなたの答えに使用しますか? – knocte

+0

OPのコードに可能な限り近づけるため。 –

関連する問題