在F#中,>>运算符是什么意思?

Rus*_*ell 33 f# operators

我在这个示例中的一些代码中注意到包含>>运算符:

let printTree =
  tree >> Seq.iter (Seq.fold (+) "" >> printfn "%s")
Run Code Online (Sandbox Code Playgroud)

>>运营商的意思/做什么?

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

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
Run Code Online (Sandbox Code Playgroud)

p.c*_*ell 66

它是函数组合运算符.

有关Chris Smith的博客文章的更多信息.

介绍Function Composition运算符(>>):

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

其读作:给定两个函数f和g,以及一个值x,计算x的f的结果并将该结果传递给g.这里有趣的是你可以调用(>>)函数并只传入参数f和g,结果是一个函数,它接受一个参数并产生结果g(f(x)).

这是一个用较小的函数组成函数的快速示例:

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
Run Code Online (Sandbox Code Playgroud)

执行时打印'-4'.

  • 对于来自 OOP 的我们来说,看到这个会让人头疼,但后来我意识到我可以用 `(Entry.nv >> SetFirstName > >dispatch)` 和 F# 继续给人留下深刻的印象。 (3认同)

kvb*_*kvb 15

>>运营商组成两个功能,所以x |> (g >> f) = x |> g |> f = f (g x).还有另一个操作员<<在另一个方向上编写,因此(f << g) x = f (g x)在某些情况下可能更自然.


Geo*_*rge 5

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

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