F # - Преобразование вложенных for-loops в функциональный стиль

Я пытаюсь преобразовать свои вложенные петли в более функциональный стиль.

Я возился с конвейерной обработкой, последовательностями и массивами, но безрезультатно.

Вот что у меня есть:

let allCarrierCodes = new List<string>()    
for result in getAllCarrierCodesResults do
        for carrierCode in result do
            allCarrierCodes.Add(carrierCode.ToString())
  • getAllCarrierCodesResults является seq типа "obj list"

Какой хороший функциональный способ переписать вложенные циклы?

Спасибо.

Ответ 1

Вы можете использовать Seq.collect:

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

или

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

вы можете затем преобразовать полученный seq<string> в конкретную коллекцию, которую вы хотите.

Ответ 2

Ответ Ли лучше, чем этот, но я просто хотел упомянуть, что вы можете полностью просто вставить те вложенные петли внутри понимания списка, а voila:

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

Выглядит как настоятельный, но действительно функциональный.

Кроме того, вы должны использовать string carrierCode вместо carrierCode.ToString(). Защищает вас от NRE и выглядит более функционально для дополнительного бонуса: -)