Итерация по вложенной последовательности в F # - Как? - PullRequest
3 голосов
/ 02 апреля 2011

Я могу определить простой список в F # следующим образом и перебрать его с помощью следующего кода:

let ar = [0;1;2;3]
ar |> Seq.iter (fun x -> printfn "Ar: %A" x)

Теперь рассмотрим вложенную последовательность следующим образом:

let ar1 = [1;2;3;4]
let ar2 = [5;6;7;8]
let nested_array = [ar1; ar2]

Как я могу повторить это - следующий код, приведенный ниже, выдает ошибку:

'Неожиданный инфиксный оператор в лямбда-выражении'

То, что я пытаюсь сделать здесь, - это перебирать внешнюю последовательность и передавать ее во второй итератор, который затем позволяет мне получить доступ к содержимому внутренних массивов.

nested_array |>
Seq.iter (fun x -> |> 
                    Seq.iter  (fun y ->
                    printfn "Ar: %A" y))

Чего мне здесь не хватает - я подозреваю, что проблема с синтаксисом или (более серьезный / вероятный) недостаток понимания F # / FP.

Ответы [ 3 ]

6 голосов
/ 02 апреля 2011

Вы не используете свою переменную x.Попробуйте либо

nested_array |> Seq.iter (fun x -> x |> Seq.iter (fun y -> printfn "Ar: %A" y))

, либо (полностью исключая использование x)

nested_array |> Seq.iter (Seq.iter (fun y -> printfn "Ar: %A" y))

или даже (исключая также y)

nested_array |> Seq.iter (Seq.iter (printfn "Ar: %A"))
3 голосов
/ 02 апреля 2011

Обычно я не люблю использовать функцию Seq.iter, когда она не входит в состав большого конвейера обработки.Альтернатива состоит в том, чтобы просто использовать вложенные for:

for nested in nested_array do
  for y in nested do printfn "Ar: %A" y

Хотя, правда, что использование приложения с частичными функциями (как опубликовано в kvb) выглядит довольно неплохо, так что это просто вопрос личных предпочтений -и кто вы ожидаете прочитать это.Я предполагаю, что мой подход не состоит в том, чтобы сделать исходный код «более умным», если он не дает вам четкого значения.

1 голос
/ 02 апреля 2011

Попробуйте это.

nested_array |> Seq.iter (fun x -> x |> Seq.iter (printfn "% d"))

...