
Am Mittwoch 02 Dezember 2009 03:28:04 schrieb Michael Mossey:
Daniel Fischer wrote:
getNumber :: String -> AssignedNumbers -> (Int,AssignedNumbers)
Yeah, that screams State Monad.
Hi, thanks for all the advice.
I was hoping my AssignedNumbers "class" would be useful with many data structures. In other words I would have
data State1 = State1 { a :: AssignedNumbers, b :: AssignedNumbers, ... } data State2 = State2 { c :: AssignedNumbers, d :: AssignedNumbers, ... }
func1 :: State State1 Int func1 = do ... something using a and b ...
func2 :: State State2 Int func2 = do ... something using c and d ...
So I thought maybe I could defined a function like
nextNumber :: MonadState s m => (s -> AssignedNumbers) -> (AssignedNumbers -> s) -> m Int nextNumber retreive putBack = ...
and have it be useful in both "State State1 a" and "State State2 a" monads, but defining the retrieve and putBack functions isn't pretty.
I will try to grok Robert's reply also. Maybe he has something addressing this.
Definitely. data AssignType = Oscillator | Table | Thingamajig deriving (Eq, Ord, Ix) data MusicState = MS { assignedNumbers :: Array AssignType AssignedNumbers , other stuff } deriving (Everything you need) fetchNumber :: String -> AssignType -> State MusicState Int fetchNumber str ty = do an <- gets ((! ty) . assignedNumbers) let (i,newAn) = getNumber str an modify (\ms -> ms{ assignedNumbers = assignedNumbers ms // [(ty,newAn)] }) return i doSomeMusicStuff aString1 aString2 = do o <- fetchNumber aString1 Oscillator t <- fetchNumber aString2 Table return (o,t)
Mike