
Warning about the use of (:=): This symbol has been proposed by John Hughes for use in some future version of Haskell to distinguish monomorphic and polymorphic `let` constructs. (See, for example, http://www.math.chalmers.se/~rjmh/Globals.ps , section 6.) You might prefer to choose a different symbol, such as (:==) or (::=). Dean Daan Leijen wrote:
2. The := operator. The =: function should say "assign to this property". Is seems to be the wrong way round. Is it possible to use the constructor := , or is this conceptionally difficult?Great plan. I tried it in my upcoming wxWindows-GIO library, and foundthat I needed existential types. Not a problem since we are GHCdependent anyway :-) (well, maybe not, NHC is getting really good these days).Anyway, I defined:
data Attr w a = Attr (w -> IO a) (w -> a -> IO ()) -- getter and setter
data Prop w = forall a. (:=) (Attr w a) a -- := is a constructor
set :: w -> [Prop w] -> IO () set w props = mapM_ setProp props where setProp ((Attr getter setter) := x) = setter w x
get :: w -> Attr w a -> IO a get w (Attr getter setter) = getter w
-- example of an attribute, works for any kind of (wxWindows) Frame title :: Attr (Frame a) String title = Attr (\w -> w # frameGetTitle) (\w x -> w # frameSetTitle x)
...
gui = do ... set frame [title := "hi there"]
Really nice!, thanks for sparking the idea. Nice application of existential types too.