
Adrian May
I want to model a fish tank as a function of time onto how many fish there are in it at that time. If I already have such a function, I want to operate on it with something like "add 2 fish on day 20" or "take 3 away on day 15" to get a new function of the same form, but the latter should not remove more fish than there are in the tank at that time, and it should tell me how many I get. I don't promise to apply these operators in chronological order.
This seems like the kind of thing that would be in the prelude somewhere. But where?
Let's see. You want to model a "number of fish" value: Integer but that value depends on time: Time -> Integer So you have a "what do I get?" and a "how do I get it?". The former can be abstracted away: type Timed a = Time -> a type Timed a = (->) Time a type Timed = (->) Time And yes, Timed is a monad. You may know it as Reader Time, but Reader is just (->) in disguise. However, you don't need it to be a monad: applyAt :: Time -> (a -> a) -> Timed a -> Timed a applyAt tEv f c t | t >= tEv = f (c t) | otherwise = c t Then you can add two fish on day 20: applyAt 20 (+ 2) and take 3 away on day 15: applyAt 15 (subtract 3) Have fun. =) Greets, Ertugrul -- Not to be or to be and (not to be or to be and (not to be or to be and (not to be or to be and ... that is the list monad.