2017-09-21 7 views
1

私はlist1をlist2に追加するカスタム関数を持っています。F#custom append function

let append ls1 ls2 = 
    let rec loop ls ls1 ls2 = 
     match ls1, ls2 with 
     | _, hd::tl -> 
      loop (hd::ls) ls1 tl 
     | hd::tl, _ -> loop (hd::ls) tl ls2 
     | _ -> ls 
    loop [] ls1 ls2 

正常に動作します。私は

let appended = append [1;2;3;4;5] [6;7;8;9;10] 

代わりの[1;2;3;4;5;6;7;8;9;10]を返す関数を呼び出すときしかし、問題は、それはそれはリストの両方を反転さ

[5;4;3;2;1;10;9;8;7;6] 

を返しています。

+0

であり、あなたの質問は何ですか? それが間違った結果なら、もう一度考えてみてください。 'hd :: tl'は' tl'の頭に 'hd'をつけて、最後には付けないようにしてください。 – xuanduc987

+0

希望の結果は[1; 2; 3; 4; 5; 6; 7; 8; 9; 10; –

+0

この質問はどのように昨日の質問と異なっていますか?そこの答えを見てください。 – dumetrulo

答えて

1

リストを逆にする必要があります。 解決策の1つは、revの機能がどのように見えるかを考えることです。 がここに最初の試みです:

let rec rev lst = 
    match lst with 
    | h::t -> (rev t)@[h] 
    | [] -> [] 

この関数は、リストが逆になりますが、今のは、アキュムレータを使用する別のバージョンを実行してみましょう、これは代わりに、最後の行に空のリストを使用しての私たちは、加算のparamaterを使用することを意味します:

let rec rev lst acc = 
    match lst with 
    | h::t -> rev t (h::acc) 
    | [] -> acc 

だから今我々がパラメータとして空のリストを渡すことがあります。

rev [1..4] [];; 

ヴァルそれ:int型のリスト= [4。 3; 2; 1]

なぜこのような機能が必要なのでしょうか?この機能はよくtail recursiveですが、それはあなたの質問ではありません。あなたは2つのリストを追加しようとしています。これはあなたが探している機能の90%であることが判明しました。

代わりに空のリストを渡すの2番目のリストを渡した場合:

rev [1..4] [5..8];; 

ヴァルそれ:int型のリスト= [4。 3; 2; 1; 5; 6; 7; 8]

かなり近いが、はい、最初のリストを反転させ、[OK]を私たちはリストを逆転、それでは、最初のリスト逆転させることができます。この機能を持っている:

rev (rev [1..4] []) [5..8] ;; 

ヴァルそれ:int型のリストを= [ 1; 2; 3; 4; 5; 6; 7; 8]

グレートを、今このrevは、私たちのloop機能することができます

let append lst1 lst2 = 
    let rec rev lst acc = 
     match lst with 
     | h::t -> rev t (h::acc) 
     | [] -> acc 
    rev (rev lst1 []) lst2 

期待通りに動作しますが、私たちは二度私たちのパラメータ化rev機能を呼び出していることに注意してください。さまざまな問題を解決するために、関数型プログラミングが関数をどのように組み合わせることができるのかを考えてください。この場合、関数をそれ自身と組み合わせています。次のコード

2

は私

let rec append list1 list2 = 
    match list1, list2 with 
    | hd::tl, _ -> hd::(append tl list2) 
    | _, hd::tl -> hd::(append list1 tl) 
    | _ -> [] 

のために働いて、次のコードの出力は次のとおりです。

let List1 = [1; 3; 5]; 
    let List2 = [7] 
    printf "%A" append List1 List2 

[1; 3; 5; 7]