
Adam Smyczek wrote:
data SampleType = A | B Int | C String | D -- .... etc.
sampleTypes = [A, B 5, C "test"] :: [SampleType]
How do I find for example element A in the sampleTypes list?
Here's one way to do it: filter (\x -> case x of A -> True; otherwise -> False) sampleTypes ==> [A] filter (\x -> case x of B _ -> True; otherwise -> False) sampleTypes ==> [B 5] filter (\x -> case x of C _ -> True; otherwise -> False) sampleTypes ==> [C "test"] Your idea works just as well:
isA :: SampleType -> Bool isA A = True isA _ = False
filter isA sampleTypes ==> [A] There is a third possibility: Have you learned about the maybe function or the either function yet? maybe :: b -> (a -> b) -> Maybe a -> b either :: (a -> c) -> (b -> c) -> Either a b -> c I would call these "mediating morphisms", where "morphism" is techno- babble for "function". You could write your own version of one of these for SampleType. Assuming you have: data SampleType = A | B Int | C String You could write: sampletype :: t -> (Int -> t) -> (String -> t) -> SampleType -> t sampletype a bf cf s = case s of A -> a B n -> bf n C s -> cf s isA = sampletype True (const False) (const False) isB = sampletype False (const True) (const False) isC = sampletype False (const False) (const True) filter isA sampleTypes ==> [A] This (the mediating morphism) is probably overkill for what you want to do, though.