2011-03-13 78 views
4

我声明一个管道是如何处理的?我知道三种方式:我应该如何申报管道?

let hello name = "Hello " + name + "!"  
let solution1 = hello <| "Homer" 
let solution2 = "Homer" |> hello 

你会选择哪一种? solution1或solution2 - 为什么?

回答

7

如前所述,管道转发运算符|>有助于功能组合和类型推断。它允许您重新排列函数的参数,以便您可以先放置函数的最后一个参数。这使得链接的功能非常可读(类似于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) 
+0

,而且'let solution5 = createPerson 1 |> hello'可以用吗? – ebb 2011-03-13 15:29:03

+0

@ebb:一个更好的例子是'1 |> createPerson |> hello' - 你的例子也可以工作,但仅仅是因为'1'是一个常量 – BrokenGlass 2011-03-13 15:39:06

+0

你是否介绍了一个不使用常量的例子? – ebb 2011-03-13 15:45:03

3

F#从上到下,从左到右读取。出于这个原因,|>运营商使用远远多于<|,因为它有助于进行类型推断。

+0

@J库珀 - 是否有任何情况下'<|'会是有用的? – ebb 2011-03-13 15:12:13

+0

有时你可以使用它来避免括号,我想,就像'如果不是<| f x y then ...' – 2011-03-13 16:07:41

+3

我更喜欢用'raise <|例外()'而不是'(引发异常())'或向后寻找'Exception()|> raise' – petebu 2011-03-13 19:41:47