リストを逆にする必要があります。 解決策の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
機能を呼び出していることに注意してください。さまざまな問題を解決するために、関数型プログラミングが関数をどのように組み合わせることができるのかを考えてください。この場合、関数をそれ自身と組み合わせています。次のコード
であり、あなたの質問は何ですか? それが間違った結果なら、もう一度考えてみてください。 'hd :: tl'は' tl'の頭に 'hd'をつけて、最後には付けないようにしてください。 – xuanduc987
希望の結果は[1; 2; 3; 4; 5; 6; 7; 8; 9; 10; –
この質問はどのように昨日の質問と異なっていますか?そこの答えを見てください。 – dumetrulo