以无点风格编写,即定义没有显式参数的函数,当隐式参数超过一个时会变得丑陋。
使用正确的运算符组合总是可以做到的。但结果会令人失望,您将失去无点样式的主要好处 - 简单易读。
为了乐趣和学习,我们会试一试。让我们从显式(又名“pointful”)风格开始,然后从那里开始工作。
(注意:我们将把我们的组合运算符重新排列成它们的显式形式(>>) (a) (b),而不是更常见的a >> b。这会创建一堆括号,但它会让事情更容易理解,不用担心关于有时不直观的运算符优先规则。)
let h x y = f x y |> g
let h x = f x >> g
// everybody puts on their parentheses!
let h x = (>>) (f x) (g)
// swap order
let h x = (<<) (g) (f x)
// let's put another pair of parentheses around the partially applied function
let h x = ((<<) g) (f x)
我们来了!看,现在h x 以我们想要的shape 表示——“将x 传递给f,然后将结果传递给另一个函数”。
该函数恰好是((<<) g),该函数将float -> float 作为参数并返回其与g 的组合。
(g 出现秒的组合,这很重要,即使在使用的特定示例中也没有什么区别。)
我们的float -> float 参数当然是(f x),即f 的部分应用。
所以,以下编译:
let h x = x |> f |> ((<<) g)
现在可以很清楚地简化为
let h = f >> ((<<) g)
当您已经知道它的含义时,这并不是所有的 看起来很糟糕。但是任何有理智的人都更愿意写和阅读let h x y = f x y |> g。