如何从功能到功能(如组合)干净地处理参数

时间:2012-08-22 15:11:45

标签: .net f# fold function-composition

let myFunc x y =
    List.fold (&&) true [func1 x y; func2 x y]

我不知道F#中所有不同的运算符和技术,但我希望我可以用一些运算符代替“xy”代替func1和func2来向他们指示“只需要我的参数”几乎就像是如何组合隐式参数传递。

或者,如果有人能够想到一种更直接,更干净的方式来解决这个问题,那么就不需要我的功能来处理它的参数,请告诉我。

此外,如果这是不可能的,这似乎完全有可能,请告诉我。

谢谢!

1 个答案:

答案 0 :(得分:3)

我认为没有一种很好的方法可以将myfunc的参数与func1func2的参数相关联。但是,您的示例可能有点过于简单,因为您可以写:

let myfunc x y = 
  func1 x y && func2 x y

我认为实际上,你有更多的函数,然后使用fold很有意义。在这种情况下,您可以使用fold来组合函数,而不是使用它来组合结果

如果我稍微简化问题并假设func1func2将两个参数作为元组(而不是将它们作为两个单独的参数),那么你可以这样写:

let func1 (a, b) = true
let func2 (a, b) = true

let myfunc = List.fold (fun f st a -> f a && st a) (fun _ -> true) [ func1; func2 ] 

现在您不需要显式传递参数(func1func2),但fold的参数有点复杂。我觉得这很好,因为你只需要写一次(这样就可以读得很清楚)。

但是,如果你喜欢无点样式(或者只是想看看你能得到多远),你可以定义一些辅助函数,然后按如下方式编写代码:

/// Given a value, returns a constant function that always returns that value
let constant a _ = a
/// Takes an operation 'a -> b -> c' and builds a function that
/// performs the operation on results of functions    
let lift2 op f g x = op (f x) (g x)

let myfunc2  = List.fold (lift2 (&&)) (constant true) [ ffunc1; ffunc2 ] 

如果您不需要任意数量的函数,那么我会简化代码而根本不使用fold。如果你需要这样做,那么我认为你的版本非常易读且不会太久。我在这个答案中写的例子表明你可以避免手工传递参数,但这会使代码有点神秘。