f# - 有风格地学习 F#

标签 f# coding-style

<分区>

当将一个函数传递给另一个应该计算结果的函数,然后将该值作为参数传递给另一个函数时,我发现我可以用 5 种不同的方式“组合”以下代码。

let testnum testFun =
    testFun 4

printfn "result: %b" (testnum (=) 0)  

printfn "result: %b" <| testnum (<) 0

printfn "result: %b" (testnum <| (>=) 0)

testnum <|  (=) 0 |> printfn "result: %b"

printfn "resutl: %b" << testnum <| (<>) 0

我确实更喜欢不带括号的样式,但现在我想知道,如果我的目标是代码的可读性可支持性,是否有首选样式? p>

最佳答案

对于你的例子,我会选择第一个:

printfn "result: %b" (testnum (=) 0) 

第二个还过得去:

printfn "result: %b" <| testnum (<) 0

其他的太做作了,看起来像是在混淆视听。

我只在两种情况下使用“后向”管道运算符:

  • 当我有一个需要嵌套括号的类型构造函数时,所以 Some <| Foo ("bar", "baz")而不是 Some (Foo ("bar", "baz"))

  • 当我想将单个匿名函数作为最后一个参数传递时 - 它可以很好地传达操作所在的位置:

    lock sync <| fun () ->
        ...
    

    值得一提的是,如果有多个匿名函数作为参数传递,我通常会将它们中的每一个都用括号括起来(值得注意的异常(exception)是当其中一个是几个字符长一个衬里而另一个有多行时 -那么我仍然会使用上面的语法。

至于流水线,我通常会选择 |>对于更长的管道,并使用函数组合 >>对于更短的函数,当我不需要在函数体中再次引用参数时。

我不认为我会把 |><|在同一行中,而不用括号括起其中之一。看起来很奇怪。

关于f# - 有风格地学习 F#,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25565532/

相关文章:

compiler-errors - MSB3245 :Could not resolve this reference (System. 绘图.成像)

wpf - 不可变状态 - 有效地将更改传播到 GUI

java - 分配和格式化的首选选项是什么?

分配的 Python 对齐方式(样式)

html - 如何在 HTML 标记中对 &lt;script&gt; 标签与 &lt;style&gt; 标签进行排序以获得最佳结果

f# - F# 的较短类型约束

haskell - 使用 fsharp-typeclasses 来创建适用于任意 monad 的函数

F# 对包含记录的可辨别联合进行模式匹配

java - 在模型类中使用 java.awt.Point - 糟糕的编码风格?

c - 检查读写系统调用的返回值的最佳方法是什么?