John Ky wrote: > On 1/25/07, BBrraannddoonn SS.. AAllllbbeerryy > KKFF88NNHH <[EMAIL PROTECTED]> wrote: > I'm probably missing something, but: > > (a) Why not: > > data ANode = Branch { name :: String, description :: String, > children :: [AnyNode] } > | Leaf { name :: String, value :: String } -- this reuse > is legal > -- leaving Node available if you still need it > > Would I be able to this? > > getLeaves :: ANode -> [Leaf]
data Branch = Branch { name :: String, description :: String, children :: [AnyNode] } data Leaf = Leaf { name :: String, value :: String } data AnyNode = Either Branch Leaf Now if you absolutely insist on overloading the 'name' identifier, you can do this: data Branch = Branch { brName :: String, description :: String, children :: [AnyNode] } data Leaf = Leaf { lName :: String, value :: String } data AnyNode = Either Branch Leaf class HasName a where name :: a -> Name instance HasName Branch where name = brName instance HasName Leaf where name = lName instance HasName AnyNode where name = either brName lName Okay, you lose record update and construction syntax for AnyNode, but I don't think that's so much of a loss. On a side note, all this has nothing to do with OOP. If you wanted to simulate objects, you would "replace case by polymorphism", but I can't demonstrate how to do that, since none of your "objects" has any methods. -Udo. -- "Technology is a word that describes something that doesn't work yet." -- Douglas Adams, JavaOne keynote, 1999
signature.asc
Description: Digital signature
_______________________________________________ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe