我有数据类型:
data SidesType = Sides Int Int Int deriving (Show)
我需要一个函数来获取SidesType列表并从中删除重复项。
*Main> let a = [Sides 3 4 5,Sides 3 4 5,Sides 5 12 13,Sides 6 8 10,Sides 6 8 10,Sides 8 15 17,Sides 9 12 15,Sides 5 12 13,Sides 9 12 15,Sides 12 16 20,Sides 8 15 17,Sides 15 20 25,Sides 12 16 20,Sides 15 20 25]
*Main> removeDuplicateFromList [] a
[Sides 3 4 5,Sides 5 12 13,Sides 6 8 10,Sides 6 8 10,Sides 8 15 17,Sides 9 12 15,Sides 5 12 13,Sides 9 12 15,Sides 12 16 20,Sides 8 15 17,Sides 15 20 25,Sides 12 16 20,Sides 15 20 25]
这是我的解决方案:
removeElementFromList :: [SidesType] -> SidesType -> [SidesType]
removeElementFromList lst element =
let (Sides a b c) = element
in [(Sides x y z) | (Sides x y z) <- lst, (x /= a) || (y /= b)]
removeDuplicateFromList :: [SidesType] -> [SidesType] -> [SidesType]
removeDuplicateFromList inlist outlist
| (length outlist) == 0 = inlist
| otherwise =
let element = head outlist
b = tail outlist
filtered = removeElementFromList b element
in removeDuplicateFromList (inlist ++ [element]) filtered
我只是想知道是否有其他方法以更多的haskell方式编写此代码?
答案 0 :(得分:6)
像往常一样,“By”功能增加了灵活性:
nubBy :: (a -> a -> Bool) -> [a] -> [a]
PS虽然它是O(n ^ 2)
答案 1 :(得分:2)
您已经为您的数据类型派生Show
。如果您也派生Eq
,则可以使用nub
中的module Data.List
。
答案 2 :(得分:0)
使用Data.List.nub
答案 3 :(得分:0)
首先派生订单类:
data XYZ = XYZ .... deriving (Show, Eq, Ord)
或者在Eq实例上写下:
instance Eq XYZ where
a == b = ...
然后聪明并使用树! [计算机科学树从上到下生长!] [1]
import qualified Data.Map.Strict as Map
removeDuplicates ::[a] -> [a]
removeDuplicates list = map fst $ Map.toList $ Map.fromList $ map (\a -> (a,a)) list
长度为N的列表的复杂性(从右到左):
它们被连续调用,这意味着,各部分的复杂性之间存在优势=&gt; O(2 * N + N * log N + log N)= O(N * log N)
这比在列表上遍历N ^ 2次更好! 见:wolframAlpha plots。出于比较原因,我还包括2 * N.
2 + 3:http://hackage.haskell.org/package/containers-0.5.4.0/docs/Data-Map-Strict.html
[1]:搜索维基百科的计算机科学树