Haskell のスタックに関する適切な説明はどこにありますか。現在、私が知っているのは次のとおりです。
従来の抽象データ型は、データの内部表現を完全に隠します
リストを使用してポリモーフィック スタックを実装でき、消費者にその内部の仕組みを伝える必要はありません。
抽象スタックインターフェイスを使用する必要がある通常の理由は、内部表現が非表示にしたい操作をサポートしているためです。たとえば、変更可能なリンクリストまたは配列を使用すると、内部表現を取得した場合に、スタックの途中で要素を変更できます。
Haskellでは、リストは単一リンクで不変であるため、この問題は実際には発生しません。それらを使用して実行できる唯一の操作は、コンストラクターを使用して新しいリストを作成し:
(基本的に「プッシュ」操作)、リストのパターンマッチングを行い、リストの先頭要素と末尾を取得することです(基本的に「ポップ」操作)。 )。他のすべてのリスト関数は、これら2つの「プッシュアンドポップ」プリミティブの上に実装されています。
LYAH で State モナドを使用して Haskell でスタックを作成することについての適切な説明があります。