在F#中,>>是什么运营商意味着

时间:2009-12-14 22:44:39

标签: f# operators

我注意到此sample中包含>>的一些代码操作者:

let printTree =
  tree >> Seq.iter (Seq.fold (+) "" >> printfn "%s")

>>是什么运算符mean / do?

非常感谢,现在它更加清晰了。 这是我为了得到它而生成的我的例子:

open System
open System.IO

let read_lines path = File.ReadAllLines(path) |> Array.to_list

let trim line = (string line).Trim()
let to_upper line = (string line).ToUpper()

let new_list = [ for line in read_lines "myText.txt" -> line |> (trim >> to_upper) ]

printf "%A" new_list

5 个答案:

答案 0 :(得分:64)

这是函数组合运算符。

有关Chris Smith's blogpost的更多信息。

  

介绍功能组合   运算符(>>):

     

let inline (>>) f g x = g(f x)

     

其中读作:给定两个函数,f   和g,和一个值,x,计算   x的f的结果并传递该结果   到g。这里有趣的是   你可以讨论(>>)函数   并且只传递参数f和g,   结果是一个需要的功能   单个参数并产生   结果g(f(x))。

     

这是一个组成a的快速例子   功能较小的功能:

let negate x = x * -1 
let square x = x * x 
let print  x = printfn "The number is: %d" x
let square_negate_then_print = square >> negate >> print 
asserdo square_negate_then_print 2
  

执行时打印'-4'。

答案 1 :(得分:14)

>>运算符组成两个函数,因此x |> (g >> f) = x |> g |> f = f (g x)。还有另一个运算符<<在另一个方向上编写,因此(f << g) x = f (g x)在某些情况下可能更自然。

答案 2 :(得分:2)

根据F# Symbol and Operator Reference,它是Forward Function Composition运算符。

答案 3 :(得分:2)

组合运算符<<>>用于连接两个函数,使得一个函数的结果成为另一个函数的输入。由于函数也是值,除非另有说明,否则它们将被视为如此,以便以下表达式是等效的:

f1 f2 f3 ... fn x = (..((f1 f2) f3) ... fn) x

具体而言,f2, f3, ...fnx被视为值,在作为参数传递给其前面的函数之前不会被评估。有时这就是你想要的,但有时候你想表明一个函数的result是另一个函数的输入。这可以使用组合运算符<<>>来实现:

(f1 << f2 << f3 ... << fn) x = f1(f2(f3 ... (fn x )..)

类似地

(fn >> ... f3 >> f2 >> f1) x = f1(f2(f3 ... (fn x )..)

由于合成运算符返回一个函数,因此不需要显式参数x,这与管道运算符x |> fn ... |> f1f1 <| ... fn <| x

不同

答案 4 :(得分:1)

这是函数组合,用于partial application