我声明一个管道是如何处理的?我知道三种方式:我应该如何申报管道?
let hello name = "Hello " + name + "!"
let solution1 = hello <| "Homer"
let solution2 = "Homer" |> hello
你会选择哪一种? solution1或solution2 - 为什么?
我声明一个管道是如何处理的?我知道三种方式:我应该如何申报管道?
let hello name = "Hello " + name + "!"
let solution1 = hello <| "Homer"
let solution2 = "Homer" |> hello
你会选择哪一种? solution1或solution2 - 为什么?
如前所述,管道转发运算符|>
有助于功能组合和类型推断。它允许您重新排列函数的参数,以便您可以先放置函数的最后一个参数。这使得链接的功能非常可读(类似于C#中的LINQ)。你的例子并没有显示这个功能 - 当你为连续的几个函数建立了一个变换“管道”时,它真的会发光。
使用|>
链接你可以写:
let createPerson n =
if n = 1 then "Homer" else "Someone else"
let hello name = "Hello " + name + "!"
let solution2 =
1
|> createPerson
|> hello
|> printf "%s"
管向后操作<|
的好处是,它改变了运算符优先级,因此它可以为你节省很多括号:函数的参数,通常先计算左正确的,使用<|
如果你想将一个函数的结果传递给另一个函数,你不需要括号 - 你的例子并没有真正利用这一点。
这些是等价的:
let createPerson n =
if n = 1 then "Homer" else "Someone else"
let hello name = "Hello " + name + "!"
let solution3 = hello <| createPerson 1
let solution4 = hello (createPerson 1)
,而且'let solution5 = createPerson 1 |> hello'可以用吗? – ebb 2011-03-13 15:29:03
@ebb:一个更好的例子是'1 |> createPerson |> hello' - 你的例子也可以工作,但仅仅是因为'1'是一个常量 – BrokenGlass 2011-03-13 15:39:06
你是否介绍了一个不使用常量的例子? – ebb 2011-03-13 15:45:03