[Haskell-cafe] Wouter-style expressions
ronwalf at volus.net
Wed Jun 4 02:21:45 EDT 2008
Here's something that should be an easy extension of Wouter's approach
to extensible datatypes, but I'm failing (possibly since it's 2:20am).
I several classes of expressions I'm trying to represent (thus,
Wouter's approach), and my first operation to implement over them is
Attached is a simplified version of what I'm doing. Expressions are
composed of conjunctives (and) and atoms. Atoms are composed of a
predicate string and a list of fillers (taken from 'Const' and 'Var').
For example (in a lisp like syntax):
(and (pred c ?var1) (pred ?var1 ?var2))
To do this, I defined a 'Printable' class:
class Functor f => Printable f where
exprDoc :: f t -> Doc
I think the 't' here will get me into trouble later.
Combinations of printable types are also printable:
instance (Printable f, Printable g) => Printable (f :+: g) where
exprDoc (Inr x) = exprDoc x
exprDoc (Inl y) = exprDoc y
Constants, variables, and atoms are defined to be printable:
instance Printable Var where
exprDoc (Var name) = text ('?':name)
instance Printable Const where
exprDoc (Const name) = text name
instance Printable f => Printable (Atomic (Expr f)) where
exprDoc (Atomic p tl) = parens $ hsep $
(text p) : (map (\ (In t) -> exprDoc t) tl)
But the obvious definition for conjunction doesn't work:
instance Printable And where
exprDoc (And el) = sep (map exprDoc el)
GHC barfs, throwing:
Couldn't match expected type `f t' against inferred type `t1'
`t1' is a rigid type variable bound by
the type signature for `exprDoc' at WouterTest.hs:62:17
Expected type: [f t]
Inferred type: [t1]
In the second argument of `map', namely `el'
In the first argument of `sep', namely `(map exprDoc el)'
I've attached the code. Compile and inspect with:
$ ghci -fglasgow-exts -fallow-overlapping-instances WouterTest.hs
test1 works great (other than needing some redundant typing, any hints?).
test2 needs the definition of 'Printable And' to print, but I haven't
gotten that to work yet. It also needs the redundant typing.
However, I tried making more complex expression (conjunction, in this
case), but I can't get the types to align. In particular, if I
uncomment the obvious definition
-------------- next part --------------
A non-text attachment was scrubbed...
Size: 2502 bytes
Desc: not available
Url : http://www.haskell.org/pipermail/haskell-cafe/attachments/20080604/0eb8ece1/WouterTest.obj
More information about the Haskell-Cafe