Hal Daume III writes:
> Hi all,
>
> I'm looking for some advice on what's the cleanest way to implement
> something.  The basic idea is that I have a task to solve, T.  There are
> many steps to solving this task, but they can be broken down into a small
> list of elementary steps:
>
>   - prepareData
>   - initialize
>   - doThingOne
>   - doThingTwo
>   - getResults
>

In similar situations, especially if there is more than one useful way to
use the various parts of an algorithm, I used often prefer existentials:

data Model = forall markup table alignments. Model
        {
           prepareData :: Data () -> Data markup,
           initialize  :: Data markup -> ST s table,
           doThingOne  :: Data markup -> table -> ST s alignments,
           doThingTwo  :: Data markup -> alignments -> ST s table,
           getResults  :: Data markup -> table -> alignments -> String
        }

So each model-module only needs to export one model record and the standard
algorithm can be implemented easily: (simplified, not checked for stupid
errors)

execModel model data =
        let mark = prepareData model $ data in
              runST $ do tab <- (initialize model) mark
                             align <- (doThingOne model) mark tab
                             res <- (doThingTwo model) mark align
                             return $ (getResults model) mark res align

Of course, by using existentials, no model internal type can escape.

> Now, I want in my executable my user to be able to say "-model=0" and so
> on in the command line and for it to use the appropriate model.  Each of
> these models will go in a separate module.

This way one can even program a top-level like

        doForAll data = map (\m -> execModel m data) [model0, model1, model2, ...]

which is rather useful.

Regards,
        Harald

_______________________________________________
Haskell mailing list
[EMAIL PROTECTED]
http://www.haskell.org/mailman/listinfo/haskell

Reply via email to