2017-02-05 11 views
2

私はF#を学ぼうとしています。この学習の一環としていくつかの簡単な機能を作成しようとしています。リストを逆にして新しいアイテムを追加する

私は、リストに項目を追加して結果を元に戻す関数を作成しました。これは、Visual Studio

let addThenReverse n list = 
match list with 
| [] -> [] 
| _ -> n::list |> List.rev 

addThenReverse 0 [1;2;3] //results in [3; 2; 1; 0] 

にF#インタラクティブウィンドウで非常にうまく動作しますが、私は、リストを逆にそれに項目を追加する関数を書くと難しさを抱えています。

let reverseThenAdd n list = 
    match list with 
    | [] -> [] 
    | _ -> List.rev list |> n::list 

reverseThenAdd 9 [1;2;3] //desired result [3; 2; 1; 9] 

EDIT ための望ましい結果は、上記でなければならない[9。 3; 2; 1]。これを見つけた人たちによくできました!

この第二の機能は、コンパイルされないと、私は「この式は型を持つことが期待された」警告リスト受け取る - >「bはリストのが、ここで入力している 『私がしようと、任意の変種が生じると思われる』

をCのリストをその他のコンパイルエラー。私は、List.rev listの結果として作成された新しいリストを、おそらく変数に代入して使用する必要があると仮定します(ただし、わかりません)。

+3

確かに 'addThenReverse 0 []'の結果は '[0]'でなければなりませんか? –

+0

@RobLyndon私は、単にリストを回して新しいアイテムを追加するよりも壮大な計画に着手しましたが、それがますます難しくなったので、私は熱狂を抑えて、私の視界を低くしなければなりませんでした。だからこそ、空リストのロジックがちょっと奇妙に見えます。あなたの答えとコメントに多くの感謝! –

答えて

4

逆のリストを連結式に渡しているため、コンパイラがスローされるという問題があります。あなたは実行する必要があります。

let reverseThenAdd n list = 
    match list with 
    | [] -> [] 
    | _ -> n :: (List.rev list) 

reverseThenAdd 9 [1;2;3] //desired result [3;2;1;9] 

あなたは(List.rev list)

+0

私はこの「C#」​​条件付き脳が理解しやすくなるので、この答えが好きです。かっこでは、まずこのビットを行い、その後逆のリストに追加します。私はこれが私の質問に直接答えるので、これを私の受け入れられた答えとしてマークしました。 –

4

から結果のリストにnを追加している私はあなたの希望の結果で少し混乱していることを意味しています。 Luisoには、コンパイラを修正するコードのバージョンがありますが、目的の結果には合いません。

let reverseThenAdd n list = 
    match list with 
    | [] -> [] 
    | _ -> n :: (List.rev list) 

reverseThenAdd 9 [1;2;3] //desired result [3; 2; 1; 9] 

実際の結果は[9; 3; 2; 1]になります。コメントがタイプミスで、それが実際にあなたの望む結果であれば、Luisoの答えが働きます。それ以外の場合は、addThenReversereverseThenAddの間には重大な相違はありません。「追加」とは、それぞれ異なる場合があります。私は両方のケースでは、最初のケースは実際に

| [] -> [n] 

ではなく

| [] -> [] 

されるべきだと思う

注、私はあなたがすべてで一致ステートメントを必要とは思いません。

let addThenReverse n list = n::list |> List.rev 
let reverseThenAdd n list = n::(list |> List.rev) 

その後、あなたは私が表情豊かコードのファンだ

addThenReverse 0 [] // result: [0] 
reverseThenAdd 0 [] // result: [0] 
addThenReverse 9 [1; 2; 3] // result: [3; 2; 1; 9] 
reverseThenAdd 9 [1; 2; 3] // result: [9; 3; 2; 1] 

補遺

を持っているでしょう:私は数学的に正しい処方が可能だと思います。 F#ほどエレガントで、実際に何をしようとしているかを隠すコードを書くことは可能です。作品上記のコードが、あなたはそれをより表現豊かにする、と組成演算子を使用することにより、言語がどのように機能するかについて少し詳しく知ることができます。

let add n list = n::list 
let reverse = List.rev 
let addThenReverse n = add n >> reverse 
let reverseThenAdd n = reverse >> add n 

これは前と同じ結果が得られますが、それは何を表してより明確にしています。関数型プログラミングの精神に忠実であれば、コンパイラにはとは何かではなく、を実行することができます。

+1

こんにちは、このコメントとその有用な点をありがとう。私は本当にあなたの答えとLuiso'sを受け入れることの間に引き裂かれました。私はLuisoを純粋に私の質問に直接答えた理由で受け入れました。あなたの答えがF#のより大きな学習に向けて私を指しているので、私は両方を受け入れることが好きでした。私はあなたとLuisoの答えの両方に投票しました。 –

+1

ダニエルの心配はありません。お役に立てて嬉しいです。 –

1
let reverseThenAdd n list = List.rev list @ [n] 
関連する問題