2011-11-23 12 views
10

データベース操作のためのHaskell準拠のSQL言語と、それに合った共通のタイプのクラスライブラリに取り組んでいます。どこでも意味があります。Data.Fordable for Unordered containers

データベースクエリオプティマイザの重要な目的は、不要なソートを排除することなので、ソートが実際に必要な場所の静的な表現を保持することが重要です。これは折り目のためのtypeclassの定義に私たちをもたらします。

HaskellのData.Foldableあります

class Foldable t where 
    -- | Combine the elements of a structure using a monoid. 
    fold :: Monoid m => t m -> m 

    -- | Map each element of the structure to a monoid, 
    -- and combine the results. 
    foldMap :: Monoid m => (a -> m) -> t a -> m 

    -- | Right-associative fold of a structure. 
    foldr :: (a -> b -> b) -> b -> t a -> b 

    -- | Left-associative fold of a structure. 
    foldl :: (a -> b -> a) -> a -> t b -> a 

    -- | A variant of 'foldr' that has no base case, 
    -- and thus may only be applied to non-empty structures. 
    foldr1 :: (a -> a -> a) -> t a -> a 

    -- | A variant of 'foldl' that has no base case, 
    -- and thus may only be applied to non-empty structures. 
    foldl1 :: (a -> a -> a) -> t a -> a 

このクラスは実用的な目的のために、ある区別を無視するように私には思わない(ポイント私は作ってるんだと関連していないデフォルトの定義をeliding)ほとんどのHaskellアプリケーションにとって非常に重要ですが、データベース設定にはもっと関心があります。すべてのData.Foldableインスタンスには注文があります。

要素に順序付けを行わないコンテナタイプに適用されるこのコンセプトの一般化の名前は何ですか?

の場合Haskell Data.Setの場合、実装で要求されるコンテキストはOrdなので、うまくいきます。しかし、多くの有用な型では、使用される順序付けにドメインレベルの意味がない場合があります。

もっと一般的には、fold :: Monoid m => t m -> mの定義自体はほとんど正しいです(つまりfoldMap)。私は主にそのタイプに連合性の法則(Monoidの定義による)が含まれているが、要求される共通性の法則が含まれていないために言います。他の変種は存在しません。

ソートを必要としない場所に導入したくありません。私はまた、不確定性を追跡することができないことを紹介したくありません。人々が集合/関係が物理的に保存されているかについて、実装の詳細を観察するために許可

  1. :それは間の二分法を紹介しますので、私は、どこにでも転がっtoList :: Set a -> [a]機能を持っていない言語とライブラリを構築するに興味があります
  2. 効果明らか

両方sortBy :: (a -> a -> Ordering) -> Set a -> [a]shuffle :: Set a -> Data.Random.RVar [a]は申し分のない、有用であり、含まれるように、非決定論のトラックを失います。実際には、sortByはさらに一般的なタイプがsortBy :: (TheUnorderedFoldableClassIAmTryingToName f) => (a -> a -> Ordering) -> f a -> [a]です。

このアイデアは何と呼ばれていますか?私がベースから離れている場合、どこからベースパスを離れるのですか?

答えて

2

折り畳み式の演算子で実行される演算は、単項式ではなく、可換型の半グループで演算されます。これはあなたに与えますop :: (CSemi a) => f a -> a -> a

私が見てきたように、演算子/ typeclassの典型的な名前は単なるCFoldです。 (YAHTはcps形式の折り畳みの名前としてcfoldも使用していますが、一般的な使用方法ではないと思います)