我编写了以下代码,它接收一堆点并使用gloss库将它们绘制在屏幕上。
let s = blocks pes
pts = map (map mkPt) s {- stitches to points-}
lines = map Line pts {-points to lines -}
pict = Pictures lines {- lines to a picture -}
in do displayInWindow "My Window" (200, 200) (10, 10) white pict
它运行正常,但我意识到有一个重复的模式:一系列的函数调用,每个函数调用的结果馈入下一个函数调用的最后一个参数。 因此,我进行了重构,通过删除中间变量,反转顺序并使用函数组合(“.”)链接这些函数,如下所示:
let pict = Pictures . (map Line) . (map $ map $ mkPt) . blocks $ pes
in do displayInWindow "My Window" (200, 200) (10, 10) white pict
很高兴,这也完全可行。但是我想知道我是否在牵强阅读能力,或者我只是不习惯阅读和编写点式风格的代码。此外,我如何思考这段代码?第二个版本更有效还是更简洁?有什么样式上的事情可以使它更清晰吗?
foldl
转换为foldl'
,否则我不会担心“无优化”情况。 - C. A. McCannproc
符号的Arrow
通常需要大量使用pointfree风格,因此其中有几个组合子是有用的--只需将类型签名中的Arrow
实例视为(->)
,例如(Arrow a) => a b c -> a b d -> a b (c, d)
变成了(b -> c) -> (b -> d) -> b -> (c, d)
。 - C. A. McCanndisplayInWindow "My Window" (200, 200) (10, 10) white . Pictures . map (Line . map mkPt) . blocks $ pes
。 - HaskellElephant