Maarten wrote:
Only update (see code below) is a bit ugly (I have no idea why I need
fixCastUpdate)
class (Show a, Typeable a) => ICustom a where
[snip]
update :: a -> (forall b. (ICustom b) => b -> b) -> a
update a f = f a
instance ICustom Node where
getVal (Node n) f = getVal n f
update (Node n) f = Node (update n f)
updateM :: forall a b. (ICustom a, ICustom b) => (a -> b) ->
NodeState () updateM f = do
s <- get
let s' = update s (fixCastUpdate f)
put s'
Hi Maarten -
Looking at this again, I wonder if the following changes would work:
-- this change is not strictly necessary
update :: a -> (a -> a) -> a
updateM :: (forall a. ICustom a => a -> a) -> NodeState ()
updateM f = do
s <- get
let s' = update s f
put s'
I think the reason why fixCastUpdate was needed in your original definition
of updateM is because the type of f seems to be too general (a->b) compared
to the type of f in the update method of ICustom (b->b)
Regards, Brian.
--
Logic empowers us and Love gives us purpose.
Yet still phantoms restless for eras long past,
congealed in the present in unthought forms,
strive mightily unseen to destroy us.
http://www.metamilk.com
_______________________________________________
Haskell-Cafe mailing list
[email protected]
http://www.haskell.org/mailman/listinfo/haskell-cafe