
Thanks Daniel. Yes my function operate only in a set-theory contest and your solution: subset xs ys = all (`elem` ys) xs is indeed more elegant than mine. Thanks again for your help. Luca.
From: daniel.is.fischer@web.de To: beginners@haskell.org Subject: Re: [Haskell-beginners] subset - a little add Date: Fri, 29 Jan 2010 10:06:29 +0100 CC: luca_ciciriello@hotmail.com
Am Freitag 29 Januar 2010 08:36:35 schrieb Luca Ciciriello:
Just a little add to may previous mail.
The solution I've found from myself is:
subset :: [String] -> [String] -> Bool subset xs ys = and [elem x ys | x <- xs]
Variant:
subset xs ys = all (`elem` ys) xs
but is that really what you want? That says subset [1,1,1,1] [1] ~> True. If you regard your lists as representatives of sets (as the name suggests), then that's correct, otherwise not.
However, this is O(length xs * length ys). If you need it only for types belonging to Ord, a much better way is
import qualified Data.Set as Set import Data.Set (fromList, isSubsetOf, ...)
subset xs ys = fromList xs `isSubsetOf` fromList ys
or, if you don't want to depend on Data.Set,
subset xs ys = sort xs `isOrderedSublistOf` sort ys
xxs@(x:xs) `isOrderedSublistOf` (y:ys) | x < y = False | x == y = xs `isOrderedSublistOf` ys | otherwise = xxs `isOrderedSublistOf` ys [] `isOrderedSublistOf` _ = True _ `isOrderedSublistOf` [] = False
My question is if exists a more elegant way to do that.
Luca.
Not got a Hotmail account? Sign-up now - Free _________________________________________________________________ Send us your Hotmail stories and be featured in our newsletter http://clk.atdmt.com/UKM/go/195013117/direct/01/