2011-05-13 34 views
9

是否存在實現聯合和交集的Standard Prelude函數?是否存在聯合並且與Haskell Prelude實現相交?

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

如果沒有,可能有人會說,如果我的實現是有效率的,(利用好懶惰和前奏功能)

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

上有名單unionintersect功能,在標準庫,位於Data.List,但不在Prelude本身。

至於效率去,我會說「不」,上述所有的,無論你的標準庫的。只有Eq約束條件下,才能在列表中實現高效操作。也就是說,你仍然可以在Data.List的信息中找到實現 - 參見上面的鏈接,我已經直接指出了相關的來源。

編輯 - 至於子孫後代着想簡要編,一定要看看唐的回答對你其實什麼用於此目的,而不是「在確實存在這些功能的更窄的問題所有」。

14

基礎庫提供名單版本,camccann指出。如果你想要一些更有效的,考慮Data.Set,其中規定:

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

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

與複雜O(N + M)

+6

並注意一個'Ord'約束,並與像'Set'隱藏表示的數據結構是通用的,你可以真正得到同時具有任何形式的明智效率。幾乎其他任何事情要麼會非常低效,要麼會限制其存儲的內容。 –

0

你經常會發現你需要通過搜索簽名什麼的實現。只需在Hoogle( haskell.org/hoogle/…)中放置您的類型簽名即可。

相關問題