[Haskell-cafe] Checking a value against a passed-in constructor?
Dan
danielkcook at gmail.com
Tue Jun 2 06:50:32 EDT 2009
Hi Richard,
> Yeek. Why do you want to do _that_?
Heh. I've got a parser and I want to check what I've parsed (it's an
exercise in Write Yourself a Scheme in 48 Hours).
> check (Atom _) (Atom _) = True
> check (Bool _) (Bool _) = True
> check _ _ = False
Yes I came up with this too, but it seemed ugly to create unnecessary
new values just to take them apart again.
> is_atom (Atom _) = True
> is_atom _ = False
This is nicer. It still requires listing out the possible
constructors (Bool, Atom ... the real code obviously has more). I
don't like that, because I've already listed them out once, in the type
declaration itself. Surely, I shouldn't have to list them out again?
> There are various meta-programming ("Scrap Your Boilerplate",
> "Template Haskell") approaches you can use to automate some of
> these.
You hit the nail on the head. "Why I am doing this" is because of
boilerplate. Boilerplate gives me rashes and bulbous spots on the nose.
Consider the following Ruby code:
def check(zeClass, zeValue)
zeValue.is_a? zeClass
end
This does not require a new function for every class defined in Ruby.
(To be fair, though, the class of a Ruby object tells you precious
little, compared to a Haskell type constructor).
I figured there would be a clever Haskell idiom that would give me a
similarly concise route. Does it really require Template Haskell? I can
barely parse regular Haskell as it is..
Cheers,
- Dan
More information about the Haskell-Cafe
mailing list