web-dev-qa-db-ja.com

リストの最後に要素を追加する最も簡単な方法は何ですか?

As _:: : 'a -> 'a list -> 'a list_は、リストのbeginに要素を追加するために使用されます。aのendに要素を追加する関数があるかどうか誰か教えてもらえますかリスト?そうでない場合は、List.rev (element::(List.rev list))が最も簡単な方法だと思いますか?

ありがとうございました!

14
SoftTimur

list@[element]は機能するはずです。 @リストに参加します。

16
Adi

これを行うための標準関数がない理由は、リストの最後に追加するのがアンチパターン(別名「snocリスト」またはa Schlemiel the Painterアルゴリズム )。リストの最後に要素を追加するには、リストのフルコピーが必要です。リストの先頭に要素を追加するには、単一のセルを割り当てる必要があります。新しいリストの末尾は、古いリストを指すだけです。

そうは言っても、それを行う最も簡単な方法は

let append_item lst a = lst @ [a]
19
Chris Conway

この操作は線形であるため、パフォーマンスが重要なコードの「ホット」な部分では使用しないでください。寒い場所では、Adiが示唆するようにlist @ [element]を使用します。ホットな部分では、アルゴリズムを書き直して、それを行う必要がないようにします。

これを行う一般的な方法は、処理中に結果をreverseの順序で累積し、結果を返す前に累積リスト全体を逆にすることです。したがって、N個の処理ステップ(それぞれがリストに要素を追加する)がある場合、N個の要素に対するリバースの線形コストを償却するため、2次アルゴリズムではなく線形アルゴリズムを維持します。

場合によっては、機能する別の手法は、要素をreverseの順序で処理することです。これにより、累積された結果は、明示的な反転ステップなしで正しい順序になります。

12
gasche