
On Sun, 31 May 2015 05:17:10 +0000
Alex Hammel
f as alist = [ b | (a, b) <- alist, a `elem` as ]
perhaps?
perhaps. i have no idea how that works. but don't spoil it for me though, i'm going to go of and study it :-) @Chaddai . this is for very small lists, so optimization in the form of sorting and binary lookup is definitely not worth the effort. Here's what I finally wrote. partitionMaybe is a modified version of partition from the List library. unsure what the ~(ts, fs) syntax is though, removing the `~` doesn't seem to matter. this seems fairly clean. i noticed that partition simply uses foldr. it looks like select is just a helper so that partition isn't cluttered. i'm unsure why select was broken out as a separate function instead of just being in a where clause. possibly to be able to assign it a an explicit type signature ? more likely it has something to do with the fact that in the library partition is declared inline. extract :: [(String,b)] -> [String] -> ([b], [String]) extract alist l = let inList s = lookup (uppercase s) alist (l1, l2) = partitionMaybe inList l in (l1, l2) partitionMaybe :: (a -> Maybe b) -> [a] -> ([b],[a]) partitionMaybe p xs = foldr (select p) ([],[]) xs select :: (a -> Maybe b) -> a -> ([b], [a]) -> ([b], [a]) select p x ~(ts,fs) | isJust y = ((fromJust y):ts,fs) | otherwise = (ts, x:fs) where y = p x