At first I would like to restructure your shape type:
data Shape = Circle {r :: Double}
| Rectangle {l :: Double, w :: Double}
deriving (Show)
Now let us think a bit about the type of your function getShapes, in my opinion it should have two things as input one predicate of which shapes I'd like to get back, and two from which shapes I choose, so
getShapes :: (Shape -> Bool) -> [Shapes] -> [Shapes]
would be a reasonable choice - next step - hoogle the stuff and we see the second function (filter) seems a suitable candidate for our task.
getShapes = filter
So the remaining step is to build the circle-function, usually called the predicate.
circle :: Shape -> Bool
circle (Circle _) = True
circle _ = False
If you're new to haskell - here lies one of the most powerful concepts of haskell: Pattern Matching
circle (Circle _) checks if its argument has the type Circle, where type is something like constructor in an OO language. The _ is known as I-don't-care-variable it is used when the name suits. So circle checks if the Shape it got is a Circle and doesn't care about the radius it has and returns True - OR - in any other case it returns False.
This would also work, if some weeks later I decided to add another Shape by
data Shape = Circle {r :: Double}
| Rectangle {l :: Double, w :: Double}
| Ellipsis {a :: Double, b :: Double}
deriving (Show)
so now getShape circle [circle1, ellipsis1, circle2, rectangle1, rectangle2] should yield
[circle1,circle2].