Создайте кортежи из последовательностей массивов. - PullRequest
2 голосов
/ 04 февраля 2010

По сути, я хочу взять вывод Seq.Windowed, который возвращает последовательность массивов и превратить его в последовательность кортежей

так что я хочу взять это

[[|1;2;3|];[|4;5;6|]]

и превратить его в

[(1,2,3);(4,5,6)]

Заранее спасибо.

Ответы [ 2 ]

5 голосов
/ 04 февраля 2010

Я не уверен, является ли это типо или нет, но ваши данные не соответствуют оконным.

let firstThreeToTuple (a : _[]) = (a.[0], a.[1], a.[2])

seq {1 .. 6}
|> Seq.windowed 3
|> Seq.map firstThreeToTuple
|> Seq.iter (printfn "%A")

(1, 2, 3)
(2, 3, 4)
(3, 4, 5)
(4, 5, 6)

Если вам нужна функция, которая берет последовательность и разбивает ее на последовательность массивов, вы можете использовать этот код из другого вопроса .

let chunks n (sequence: seq<_>) =
    let fold_fce (i, s) value = 
        if i < n then (i+1, Seq.append s (Seq.singleton value))
                 else (  1, Seq.singleton value)
    in sequence
    |> Seq.scan (fold_fce) (0, Seq.empty)
    |> Seq.filter (fun (i,_) -> i = n)
    |> Seq.map (Seq.to_array << snd )

Затем вы можете запустить результат через firstThreeToTuple.

seq {1 .. 6}
|> chunks 3
|> Seq.map firstThreeToTuple
|> Seq.iter (printfn "%A")

(1, 2, 3)
(4, 5, 6)
5 голосов
/ 04 февраля 2010
> let x =  [[|1;2;3|];[|4;5;6|]];;

val x : int [] list = [[|1; 2; 3|]; [|4; 5; 6|]]

> let y = [for [|a; b; c|] in x do yield (a, b, c)];;

  let y = [for [|a; b; c|] in x do yield (a, b, c)];;
  ----------------------------^

stdin(6,29): warning FS0025: Incomplete pattern matches on this expression.
For example, the value '[|_; _; _; _|]' may indicate a case not covered by
the pattern(s).

val y : (int * int * int) list = [(1, 2, 3); (4, 5, 6)]

Если вы можете гарантировать, что все ваши массивы имеют одинаковую форму, вы можете проигнорировать предупреждение выше. Если предупреждение действительно беспокоит вас, вы можете написать:

> x |> List.map (function [|a;b;c|] -> a, b, c | _ -> failwith "Invalid array length");;
val it : (int * int * int) list = [(1, 2, 3); (4, 5, 6)]
...