如何使用管道运算符重写此函数

alb*_*jan 1 f#

这些是函数定义.

func1: 'a -> unit
func2: 'b -> 'a
func3: string -> 'b list    
Run Code Online (Sandbox Code Playgroud)

目前的功能

let f =  Seq.iter((fun a -> func1(func2 a)) func3(s) 
Run Code Online (Sandbox Code Playgroud)

这是我得到的

let f =  func3(s) 
           |> ((fun a -> func2 a 
                         |> func1) 
           |> Seq.iter)
Run Code Online (Sandbox Code Playgroud)

我觉得应该可以松开lambda和parens'.

jos*_*uan 6

简单地说,你可以不用管道

Seq.iter (func1 << func2) << func3
Run Code Online (Sandbox Code Playgroud)

(这是一个带有一些参数[相同func3]和相同输出的函数Seq.iter).

你可以测试一下

let func1 x = printfn "Number: %d" x

let func2 (a, b) = a + b

let func3 = Seq.map (fun n -> (n, 2 * n))

let f : (seq<_> -> unit) = Seq.iter (func1 << func2) << func3

f [1..5]
Run Code Online (Sandbox Code Playgroud)

与输出

Number: 3
Number: 6
Number: 9
Number: 12
Number: 15

val func1 : x:int -> unit
val func2 : a:int * b:int -> int
val func3 : (seq<int> -> seq<int * int>)
val f : (seq<int> -> unit)
val it : unit = ()
Run Code Online (Sandbox Code Playgroud)

:)