Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Boolean selection of list

Tags:

haskell

Suppose we want those elements of list x for which the corresponding element of list y is strictly positive. Any of the three solutions below work:

let x = [1..4]
let y = [1, -1, 2, -2]

[ snd both | both <- zip (map (> 0) y) x, fst both ]

or

map snd $ filter fst $ zip (map (>0) y) x

or

sel :: [Bool] -> [a] -> [a]
sel [] _ = []
sel (True : xs) (y : ys) = y : sel xs ys
sel (False : xs) (y : ys) = sel xs ys

sel (map (> 0) y) x

however, what prompted this was that in the R language this can be written compactly like this:

x[y > 0]

and given how much shorter that is I was wondering if there is a shorter/better way to do this in Haskell?

like image 499
user1189687 Avatar asked Jan 18 '26 04:01

user1189687


2 Answers

I'm not a haskell specialist, but why not use list comprehension?

 [i | (i,j)  <-  zip x y, j > 0 ]
like image 110
soulcheck Avatar answered Jan 19 '26 18:01

soulcheck


If you are willing to use a language extension, I can offer the alternative

{-# LANGUAGE ParallelListComp #-}

bfilter :: (b -> Bool) -> [a] -> [b] -> [a]
bfilter cond xs ys = [x | x <- xs | y <- ys, cond y]

Nothing in Haskell will be nearly as short as the R version, because in R, it's a language built-in, but in Haskell it isn't. Apparently whoever designed R found there to be good reasons to include such a primitive, but none of the Haskell designers found there to be convincing reasons to include such a construct in the language (and it wouldn't fit in nicely, so I fully endorse that decision - it may fit in well in R, I don't know that language).

like image 45
Daniel Fischer Avatar answered Jan 19 '26 20:01

Daniel Fischer



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!