2017-02-17 11 views
4

私はいくつかの研究を行ってきましたが、List.zip関数は2つのリストを取り、タプルの1つのリストを返しますが、どのリストをタプルのリストに変更しますか?F#リストを取って、タプルのリストを返してください

let rec combinePair xs = 
    match xs with 
    | [] -> [] 
    | [x1] -> [] 
    | x1::x2::x3::xs -> [(x1, x2)] 
    | x1::x2::xs -> [(x1, x2)] 

要素の奇数リストに存在する場合の要素の偶数は、それらがタプルのリストとして返されるべきで存在する場合、最後の要素は、ドロップされるべきです。例えば

combinePair [x1; x2; x3; x4] = [(x1, x2); (x3, x4)] 

答えて

4

あなたのコードがほとんどです。

がここに思考です:

  • 空のリストを与え、結果は空のリストです(すでにあることです)。
  • 1つの要素のリストが与えられると、結果は空のリストになります(それもあります)。
  • それ以外の場合、結果の最初の項目は最初の2つの要素で構成されたタプルで、残りの結果は同じプロセスを残りの入力に適用した結果です。

これはほとんど同じのF#に変換することができます。

let rec combinePair xs = 
    match xs with 
    | [] | [_] -> [] 
    | x1::x2::rest -> (x1, x2) :: (combinePair rest) 

(私は1行、[] | [_] ->に最初の2例を組み合わせた方法に注意してください)

+0

私はまだ機能プログラミングがどのように機能するのか分かりません。ご協力ありがとうございました。 – jynx678

4

私はきれいに解決策があると確信しているが、再帰にアレルギーのある人のために:

let xsOdd = [1;2;3;4;5] 

List.chunkBySize 2 xsOdd 
    |> List.filter (fun x -> x.Length = 2) 
    |> List.map (fun x -> x.[0],x.[1]) 
//val it : (int * int) list = [(1, 2); (3, 4)] 
+3

私たちはアレルギーを患っていますが、私は指さしにくいインデックス作成にアレルギーがあります;-) 'let combinePair2 xs = xs |> List.chunkBySize 2 |>を書いて' filter'と 'map'を一つにすることができます。 List.choose(function | x1 :: x2 :: [] - > Some(x1、x2)| _ - > None) ' –

+0

@AntonSchwaighoferニース! – s952163

関連する問題