クライアントから「実際の」注文を隠す Bag コンテナーが必要です。
また、完全にポリモーフィックである必要があります。つまり、要素の型に対する制約は必要ありません。
少なくとも 3 つのバッグの実装が見つかりました: Bag
module from ghc
package、Data.Bag
frombag
およびMath.Combinatorics.Multiset
from multiset-comb
。
ただし、それらにはすべて、実装の詳細またはバッグ構築の順序に依存する要素の内部順序を公開する操作がありますtoList
。fold*
toList
少なくとも type では不可能Bag a -> [a]
です。ただし、折り畳みによって常に順序が明らかになるとは限りません。
たとえば、fold (+) 0
露出しません。
問題は、折りたたみインターフェースをどのように設計すればよいかということです。a -> a -> a
フォールディング機能の安全性に必要十分条件はありますか?は順序を公開していないためfmap
、 で折りたたむと汎用性が失われa -> b -> b
ますか?
私は可換モノイドについて考えています - それらは十分に思えますが、結合性と恒等要素が必要かどうかはわかりません。