To get another perspective, let's eliminate some unnecessary naming and see
what linear pipelines emerge:

process item mediaKind mediaSize language =
 let (numberedQuestions,questionCategories) =
       numberQuestions pagemaster $
       stripUndisplayedQuestions mediaKind $
       appendEndQuestions item
         (loadPagemaster item mediaKind mediaSize) $
       coalesceParentedQuestions $
       validateQuestionContent $
       loadQuestions item
     (bands,sequenceLayouts) =
       buildLayout mediaKind language $
       coalesceNAQuestions $
       numberedQuestions
 in
    flip combineRows sequenceLayouts $
    paginate item mediaKind mediaSize pagemaster $
    groupBands $
    resolveCrossReferences $
    bands

Warning: I haven't tried to type-check and may have made a clerical error.
Since questionCategories isn't used, use "fst" & eliminate another let.
Then, for my personal preference, and just to mix things up, switch to
"where" style:

process item mediaKind mediaSize language =
 flip combineRows sequenceLayouts $
 paginate item mediaKind mediaSize pagemaster $
 groupBands $
 resolveCrossReferences $
 bands
where
  (bands,sequenceLayouts) =
    buildLayout mediaKind language $
    coalesceNAQuestions $
    fst $
    numberQuestions pagemaster $
    stripUndisplayedQuestions mediaKind $
    appendEndQuestions item
      (loadPagemaster item mediaKind mediaSize) $
    coalesceParentedQuestions $
    validateQuestionContent $
    loadQuestions item

Not quite a work of art yet, but the structure is getting clearer to me.




On 12/28/06, Steve Schafer <[EMAIL PROTECTED]> wrote:

On Tue, 26 Dec 2006 20:21:45 -0800, you wrote:

>How would this example look if you named only multiply-used expressions?
>I'd like to see it in a more conventional pointful style with nested
>expressions.  I'm still wondering whether the awkwardness results from
your
>writing style or is more inherent.  Showing the real variable names may
also
>help also.

This is what it looks like "for real":

> process :: Item -> MediaKind -> MediaSize -> Language -> SFO
> process item mediaKind mediaSize language =
>   let pagemaster = loadPagemaster item mediaKind mediaSize;
>       questions = stripUndisplayedQuestions mediaKind $
>                   appendEndQuestions item pagemaster $
>                   coalesceParentedQuestions $
>                   validateQuestionContent $
>                   loadQuestions item;
>      (numberedQuestions,questionCategories) = numberQuestions pagemaster
questions;
>      numberedQuestions' = coalesceNAQuestions numberedQuestions;
>      (bands,sequenceLayouts) = buildLayout mediaKind language
numberedQuestions';
>      bands' = resolveCrossReferences bands;
>      groupedBands = groupBands bands';
>      pages = paginate item mediaKind mediaSize pagemaster groupedBands;
>      pages' = combineRows pages;
>      sfo = pages' sequenceLayouts;
>      in sfo

These are the function signatures:

> loadPagemaster :: Item -> MediaKind -> MediaSize -> Pagemaster
> loadQuestions :: Item -> [Question]
> validateQuestionContent :: [Question] -> [Question]
> coalesceParentedQuestions :: [Question] -> [Question]
> appendEndQuestions :: Item -> Pagemaster -> [Question] -> [Question]
> stripUndisplayedQuestions :: MediaKind -> [Question] -> [Question]
> numberQuestions :: Pagemaster -> [Question] ->
([NumberedQuestion],[QuestionCategory])
> coalesceNAQuestions :: [NumberedQuestion] -> [NumberedQuestion]
> buildLayout :: MediaKind -> Language -> [NumberedQuestion] ->
([Band],[SequenceLayout])
> resolveCrossReferences :: [Band] -> [Band]
> groupBands :: [Band] -> [[Band]]
> paginate :: Item -> MediaKind -> MediaSize -> Pagemaster -> [[Band]] ->
[Page]
> combineRows :: [Page] -> [Page]
> createSFO :: [Page] -> [SequenceLayout] -> SFO

MediaKind, MediaSize and Language are simple enumerations; everything
else is a complex structure.

Steve Schafer
Fenestra Technologies Corp.
http://www.fenestra.com/
_______________________________________________
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe

_______________________________________________
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe

Reply via email to