<p dir="ltr">Thanks! In the mean time I figured out that I need something completely different though. Actually, they're not fish, they're assorted programmers, and I need to approach the hiring plan with tasks (as in the Gantt chart code at <a href="http://nuerd.blogspot.com">http://nuerd.blogspot.com</a>) calling for certain skills and get a possibly non-contiguous booking. A Timed Integer won't support that though, unless I step through it day by day which would seem needlessly goofy. It's at brainstorming stage right now but I think I can probably plough through it, then I'll probably be back asking for help with boilerplate reduction.</p>
<p dir="ltr">Adrian.<br>
</p>
<div class="gmail_quote">On 18 May 2013 14:48, "Ertugrul Söylemez" <<a href="mailto:es@ertes.de">es@ertes.de</a>> wrote:<br type="attribution"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
Adrian May <<a href="mailto:adrian.alexander.may@gmail.com">adrian.alexander.may@gmail.com</a>> wrote:<br>
<br>
> I want to model a fish tank as a function of time onto how many fish<br>
> there are in it at that time. If I already have such a function, I<br>
> want to operate on it with something like "add 2 fish on day 20" or<br>
> "take 3 away on day 15" to get a new function of the same form, but<br>
> the latter should not remove more fish than there are in the tank at<br>
> that time, and it should tell me how many I get. I don't promise to<br>
> apply these operators in chronological order.<br>
><br>
> This seems like the kind of thing that would be in the prelude<br>
> somewhere. But where?<br>
<br>
Let's see. You want to model a "number of fish" value:<br>
<br>
Integer<br>
<br>
but that value depends on time:<br>
<br>
Time -> Integer<br>
<br>
So you have a "what do I get?" and a "how do I get it?". The former can<br>
be abstracted away:<br>
<br>
type Timed a = Time -> a<br>
type Timed a = (->) Time a<br>
type Timed = (->) Time<br>
<br>
And yes, Timed is a monad. You may know it as Reader Time, but Reader<br>
is just (->) in disguise. However, you don't need it to be a monad:<br>
<br>
applyAt :: Time -> (a -> a) -> Timed a -> Timed a<br>
applyAt tEv f c t<br>
| t >= tEv = f (c t)<br>
| otherwise = c t<br>
<br>
Then you can add two fish on day 20:<br>
<br>
applyAt 20 (+ 2)<br>
<br>
and take 3 away on day 15:<br>
<br>
applyAt 15 (subtract 3)<br>
<br>
Have fun. =)<br>
<br>
<br>
Greets,<br>
Ertugrul<br>
<br>
--<br>
Not to be or to be and (not to be or to be and (not to be or to be and<br>
(not to be or to be and ... that is the list monad.<br>
<br>_______________________________________________<br>
Beginners mailing list<br>
<a href="mailto:Beginners@haskell.org">Beginners@haskell.org</a><br>
<a href="http://www.haskell.org/mailman/listinfo/beginners" target="_blank">http://www.haskell.org/mailman/listinfo/beginners</a><br>
<br></blockquote></div>