[Haskell-beginners] Fish tank monad

Ertugrul Söylemez es at ertes.de
Sat May 18 08:45:40 CEST 2013


Adrian May <adrian.alexander.may at gmail.com> wrote:

> 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.
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 836 bytes
Desc: not available
URL: <http://www.haskell.org/pipermail/beginners/attachments/20130518/e73a4c9a/attachment.pgp>


More information about the Beginners mailing list