我注意到此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
答案 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, ...fn
和x
被视为值,在作为参数传递给其前面的函数之前不会被评估。有时这就是你想要的,但有时候你想表明一个函数的result
是另一个函数的输入。这可以使用组合运算符<<
和>>
来实现:
(f1 << f2 << f3 ... << fn) x = f1(f2(f3 ... (fn x )..)
类似地
(fn >> ... f3 >> f2 >> f1) x = f1(f2(f3 ... (fn x )..)
由于合成运算符返回一个函数,因此不需要显式参数x
,这与管道运算符x |> fn ... |> f1
或f1 <| ... fn <| x
答案 4 :(得分:1)
这是函数组合,用于partial application