Statically-typed read-only attributes

Nick Name <[email protected]>
Newsgroups gmane.comp.lang.haskell.gui
Message-ID <[email protected]>
I have tried to create read-only attributes in htoolkit. It's easy, as 
any of you will already know:

------------------------------------------
class GetterAttr attr where
    getterAttr :: attr a b -> a -> IO b
                                                                                                                         
instance GetterAttr Attr where
    getterAttr (Attr getter setter) = getter
                                                                                                                         
data RAttr w a = RAttr (w -> IO a)
                                                                                                                         
instance GetterAttr RAttr where
    getterAttr (RAttr getter) = getter
                                                                                                                         
-- | Get an attribute
get :: (GetterAttr attr) => w -> attr w a -> IO a
get w a = getterAttr a w
                                                                                                                         
-- | Define a read-only attribute. Takes the name of the attribute as 
its first argument.
readAttr :: (w -> IO a) -> RAttr w a
readAttr getter
  = RAttr getter

--- The rest is in Attr.hs-------------------------------------


I have managed to compile htk with this modification, however it turns 
out that there are classes in htk like

-- | Widgets that has specified integer position.
class Positioned w where
  -- | The widget position
  pos :: Attr w Int

Now, a programmer finding an instance of this class will think that he 
can move the object by setting the attribute. But menus are the only 
instance of this class, wich I changed to pos::Rattr w Int, because 
menus can't be moved.

This raises the problem: what if I have also "instance Positioned 
Window"? Well, this problem has many solutions, the simplest of wich is 
*not* to have statically read-only attributes. I would rather try other 
solutions, however they might complicate the class and type hierarchy.

What do you all think about this?

Vincenzo
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.