1

这些是函数定义。

func1: 'a -> unit
func2: 'b -> 'a
func3: string -> 'b list    

当前功能

let f =  Seq.iter((fun a -> func1(func2 a)) func3(s) 

这是据我所知

let f =  func3(s) 
           |> ((fun a -> func2 a 
                         |> func1) 
           |> Seq.iter)

我觉得应该可以松开 lambda 和括号。

4

3 回答 3

6

你可以不用管道,简单地

Seq.iter (func1 << func2) << func3

(这是一个带有一些参数 [same than 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]

带输出

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 = ()

:)

于 2013-05-31T08:14:14.243 回答
4

您可以使用函数组合运算符>>

func3() |> Seq.iter (func2 >> func1)

于 2013-05-31T07:51:31.567 回答
2

我认为问题是,为什么要使用管道运算符?

我发现您的原始代码非常易读。您不应该仅仅为了使用它们而尝试使用管道运算符(或函数组合)。现在,在您的代码中,输入s出现在最后,这有点令人遗憾(您看不到代码的主要输入是什么)。我可能会将其重写为(也不s是真正的描述性名称):

s |> func3 
  |> Seq.iter (fun a -> func1 (func2 a))

你也可以使用函数组合——但我不经常使用它,因为它不(总是)有助于提高可读性。但是在论据中使用它Seq.iter可能是相当合理的。

在一个完全不相关的注释上,您可以只使用for循环并编写:

for a in func3 s do
  func1 (func2 a)

实际上,我发现这比此处的任何其他版本的代码都更具可读性(如果 F# 为您提供了一种语言功能来迭代完全符合您需要的序列,为什么不使用它呢?)

于 2013-05-31T13:39:31.747 回答