2017-01-31 21 views
3

私は要素とリストをとり、その要素を削除する関数を実装しようとしています。F#リストを編集する関数

これは出力を生成していません。理由はわかりません。私はF#の初心者ですので、基本的な間違いをしている可能性があります。再帰を使用してこれを実行しようとしていることに注意してください。

+0

でそれを返す進むにつれてその後これだけでは単なる関数座っていますそこに呼び出されるのを待っている。 'remove(3、[1..5])'のようなもので呼び出す必要があります。 – TeaDrivenDev

+0

私は「ターミナルプロセスは終了コードで終了しました:1」というように呼び出そうとします。私はそれをどのように修正するか分からない。 – newguy

+0

関数内で再び呼び出すので、再帰的です。しかし、スタックオーバーフローのためにプロセスが終了する可能性が高いエラーが検出されました。マッチ式の真ん中では、 'remove(item、tl)'でなければなりません。現在、元のリストを再度渡しています。これにより、再帰は決して終了しません。 – TeaDrivenDev

答えて

3

これを試してください。

let rec remove item lst = 
    let rec removeInner item lst acc = 
     match lst with 
     | h::tl when item = h -> removeInner item tl acc 
     | h::tl -> removeInner item tl (h::acc) 
     | [] -> List.rev(acc) 
    removeInner item lst [] 

[<EntryPoint>] 
let main argv = 

    let result = remove 2 [1;2;2;3;4;2] 
    printfn "%A" result 

    0 

これは出力を生成していないと私はなぜわかりません。

バージョンが出力を生成していない理由は、このラインの

| [] -> [] 

であることが読み:リストが空リストを返す空のとき。

あなたがする必要があるのは、削除されていない値を累積し、累積された値を結果として返します。

アキュムレータをF#で使用することは、スターターにとっては一般的で、この行で作成されます。最後に

removeInner item lst [] 

[]は、あなたがそれには何も追加されていないので、で開始するための空のリストであるアキュムレータ、です。

あなたはこのラインでそれに

| h::tl -> removeInner item tl (h::acc) 

を追加し、最後にあなたがアキュムレータの値を反転させ、このライン

| [] -> List.rev(acc) 
+0

あなたは[CPS](https://en.wikipedia.org/wiki/Continuation-passing_style)を使うことができます。各呼び出しで関数を本質的に再帰的に渡し、再帰から戻って関数を呼び出し、項目をリストに追加します。アイテムは正しい順序でリストに追加されるため、それらを元に戻す必要はありません。ちょっと進んだけど、あなたはそれをやることができる。面白いことに、私はちょうど[Prolog](http://stackoverflow.com/a/41915709/1243762)を使って同様の答えをしましたが、Prologでは[difference list](https:// en.wikibooks.org/wiki/Prolog/Difference_Lists)。 –

+0

リスト追加演算子[@](https://en.wikibooks.org/wiki/F_Sharp_Programming/Lists#List.append_and_the_40_Operator)を使用できますが、リストの最後に追加するのは効率的ではありません。 F#サードパーティライブラリの1つが差分リストを作成しましたが、見つけられません。 –

+0

中:継続継承の例(http://stackoverflow.com/a/3248477/1243762) –

3

あなたの質問の意図がわからない、それは本当に削除されているか、リストに再帰的な関数を書いているかどうかです。

が何をしたいachiveする最も簡単な方法は次のとおりです。あなたの項目その助けをい

に等しいすべての要素をフィルタリング:ある

let remove item lst = List.filter (fun x -> x <> item) 

関連する問題