
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
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