2011-05-13 11 views
9

集合体と集合の共通部分を実装する標準プレリュード関数はありますか?Haskell Preludeの実装と交差していますか?

union  :: (Eq a) => [a] -> [a] -> [a] 
intersect :: (Eq a) => [a] -> [a] -> [a] 

無い場合は、私の実装が効率的である場合、誰かがリストのunionintersect機能が標準ライブラリにあります

unionSet :: (Eq a) => [a] -> [a] -> [a] 
unionSet as bs = foldl (\xs y -> if elem y xs then xs else xs ++ [y]) as bs 

intersectSet :: (Eq a) => [a] -> [a] -> [a] 
intersectSet as bs = let ns = [ a | a <- as, elem a bs] in [ b | b <- bs, elem b ns] 

答えて

14

(怠惰とプレリュード機能を有効に利用すること)、言ったことができて、 Data.Listにありますが、Preludeにはありません。

効率が上がる限り、私はあなたと標準ライブラリの両方に上記のすべてに「いいえ」と言うつもりです。実際にはEqという制約があるリストに対して効率的な操作を行うことはできません。つまり、あなたは依然としてData.Listのインプリメンテーションで実装を見つけることができます - 上記のリンクを参照してください。これは関連するソースを直接指しています。

編集 - 後世のために簡単に補遺として、あなたが実際にではなく、「これらの関数がで存在しないの狭い質問よりも、この目的のために使用したい何のためにドンの答えを必ず参照してくださいすべて"。

14

ベースライブラリは、camccannが指摘するように、リストバージョンを提供します。

union :: Ord a => Set a -> Set a -> Set a 

intersection :: Ord a => Set a -> Set a -> Set a 

を複雑はO(n + m)のに:あなたは、もう少し効率的な何かをしたい場合は、提供Data.Setを、考えます。

+6

また、 'Ord'制約と' Set'のような隠れた表現を持つデータ構造は、どんな種類の効率を持ちながらも実際に得ることができるように一般的です。他のほとんどのものは、非常に非効率的であるか、または格納できるものがより限定されているかのいずれかです。 –

0

シグネチャを検索することによって、必要なものを実装することがよくあります。あなたのタイプシグネチャをHoogleにドロップするだけです( haskell.org/hoogle/…)。

関連する問題