caml-list - the Caml user's mailing list
 help / color / mirror / Atom feed
From: Hugo Ferreira <hmf@inescporto.pt>
To: Pietro Abate <Pietro.Abate@anu.edu.au>
Cc: caml-list@yquem.inria.fr
Subject: Re: [Caml-list] Functional design for a basic simulation pipe.
Date: Thu, 11 Oct 2007 14:52:13 +0100	[thread overview]
Message-ID: <470E2A8D.4040704@inescporto.pt> (raw)
In-Reply-To: <20071011120139.GA8588@pulp.rsise.anu.edu.au>

Hi,

Pietro Abate wrote:
> Hi,
> 
> On Wed, Oct 10, 2007 at 11:56:02AM +0100, Hugo Ferreira wrote:
>>>> a: requires the input of a state and outputs an event
>>>> b: requires input of a state and the event generated at that state and
>>>> outputs processed data
>>>> c: consumes n number elements of processed data and stops when it
>>>> requires no more such data
>>>>
>>>> Note that "c" will "pull in" for example 10 states and check for
>>>> termination, "b" will therefore need "pull in" 10 events. Each time it
>>>> pulls in an event it generates a state. This last state must be made
>>>> available to "a" so that it may generate its next event.
>>>>
>>>> The issue here is how can I implement this so that I can flexibly
>>>> configure experiments by "constructing" a chain of actions but still be
>>>> able to pass back the state to one of those actions. Something like:
>>>>
>>>> let exp = a |> b (output 1 back to a) |> c
> I'm not entirely sure this is correct. Note that I've used an exception
> to get out of the loop just because I'm too lazy to wrap my head around
> the exception monad. I'm also not sure that is the best way of using a
> state monad... Any monad-experts out there to comment ?
> 

I am going to have to look at this very carefully (read: learn something
about monads). Comment below.

> This is the code:
> 
> type inputstate = int
> type output = int
> type final = int
> type event = int
> 
> module StateMonadMake(T:sig type t end) =
> struct
>   type 'state mt = 'state -> T.t * 'state
> 
>   let return a = fun s -> a, s
>   let bind m f = fun s -> let a, s = m s in f a s
>   let fetch = fun s -> return s s
>   let store = fun s -> fun _ -> return () s
>   let modify f = fun s -> return () (f s)
> end
> 
> module SM = StateMonadMake(struct type t = inputstate end)
> exception Stop of final
> 
> let a (s : inputstate) : event = 1
> 
> let b (e : event) ( s : inputstate ) : (inputstate * output) =
>     match s with
>     0 -> print_endline "final state" ; (0,1)
>     |_ -> Printf.printf "at state %i\n" s ; (s-1,s+1)
> 
> let c ( l : output list ) : final =
>     List.iter print_int l ;
>     List.fold_left (+) 0 l
> 
> let rec exp inputstate =
>     SM.bind inputstate (fun state ->
>         let newevent = a state in
>         let (newstate,newdata) = b newevent state in
>         SM.bind (SM.modify (fun olddata -> newdata::olddata)) (fun _ ->
>             if newstate = 0 then
>                 SM.bind (SM.fetch) (fun data ->
>                     raise ( Stop ( c (data) ))
>                 )
>             else exp (SM.return newstate)
>         )
>     )
> ;;
> 

I can however see that "exp" seems to be a loop. Cannot see however were
you tie the latest state of "a" with the next use of "b" 8-(. I will
really have to see how this stuff works.

Thanks.

Hugo F.

> let run =
>     try exp (SM.return 10) []
>     with Stop(i) -> Printf.printf "final %i\n" i
> 
> $ocaml hf.ml 
> at state 10
> at state 9
> at state 8
> at state 7
> at state 6
> at state 5
> at state 4
> at state 3
> at state 2
> at state 1
> 234567891011final 65
> 
> 
> pietro
> 
>>> Just to be sure I understood well, here is a diagram:
>>>
>>> --> a --> b -+-------------------------------------------------> output1
>>>              |
>>>              +--state1-> a --> b -+----------------------------> output2
>>>                                   |
>>>                                   +-state2-> a --> b -+--------> output3
>>>                                                       |
>>>                                                          ...
>>>                                                               -> outputn
>>>
>>>                                                                     |
>>>                                                                     |
>>>                                                                     |
>>>                                                                     V
>>>
>>>                                                                     c
>>>
>>>
>>> Do you agree with this ? (n beeing a variable of course...)
>> Not quite. More like:
>>
>> (_,s0)
>> -> a-> s0,e1 -> b -+--------------------------------------> s1
>>                    |
>>                    +--s1-> a -> s1,e2 -> b-+--------------> s2
>>                                            |
>>                                             ...
>>                                                          -> sn
>>                                                             |
>>                                                             |
>>                                                             |
>>                                                             V
>>                                                             c
>>
>> Note that "a" doesn't generates states "sn" it just passes it on.
>> It only generates events "en". "b" simple takes a state "sn-1" and the
>> events "en" and generates a new state "sn".
>>
>>> Shall c also take the states ?
>>>
>> Yes. But the idea is to add other functions to the "pipe" that will
>> change states to other data types for further processing.
>>
>> Note also that only the last function actually knows how much data is
>> required.
>>
>>> (I believe in good drawings to help finding an answer...)
>> Well it certainly easier to express the flow of the data.
>>
>>
>>
>>> _______________________________________________
>>> Caml-list mailing list. Subscription management:
>>> http://yquem.inria.fr/cgi-bin/mailman/listinfo/caml-list
>>> Archives: http://caml.inria.fr
>>> Beginner's list: http://groups.yahoo.com/group/ocaml_beginners
>>> Bug reports: http://caml.inria.fr/bin/caml-bugs
>>>
>>>
>> _______________________________________________
>> Caml-list mailing list. Subscription management:
>> http://yquem.inria.fr/cgi-bin/mailman/listinfo/caml-list
>> Archives: http://caml.inria.fr
>> Beginner's list: http://groups.yahoo.com/group/ocaml_beginners
>> Bug reports: http://caml.inria.fr/bin/caml-bugs
> 


  reply	other threads:[~2007-10-11 13:53 UTC|newest]

Thread overview: 18+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2007-10-10  7:39 Hugo Ferreira
2007-10-10  8:34 ` [Caml-list] " skaller
2007-10-10 10:08   ` Hugo Ferreira
2007-10-10 10:31     ` Vincent Aravantinos
2007-10-10 10:56       ` Hugo Ferreira
2007-10-11 12:01         ` Pietro Abate
2007-10-11 13:52           ` Hugo Ferreira [this message]
2007-10-11 14:20             ` Pietro Abate
2007-10-10 15:00     ` skaller
2007-10-10 15:56       ` skaller
2007-10-11  6:57         ` Hugo Ferreira
2007-10-11  8:09           ` skaller
2007-10-11  9:54             ` Hugo Ferreira
2007-10-11 13:47               ` skaller
2007-10-11 11:17 ` Zheng Li
2007-10-11 13:48   ` [Caml-list] " Hugo Ferreira
2007-10-15 23:04     ` Zheng Li
2007-10-22  7:48       ` [Caml-list] " Hugo Ferreira

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=470E2A8D.4040704@inescporto.pt \
    --to=hmf@inescporto.pt \
    --cc=Pietro.Abate@anu.edu.au \
    --cc=caml-list@yquem.inria.fr \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).