let myFunc x y =
List.fold (&&) true [func1 x y; func2 x y]
我不知道F#中所有不同的运算符和技术,但我希望我可以用一些运算符代替“xy”代替func1和func2来向他们指示“只需要我的参数”几乎就像是如何组合隐式参数传递。
或者,如果有人能够想到一种更直接,更干净的方式来解决这个问题,那么就不需要我的功能来处理它的参数,请告诉我。
此外,如果这是不可能的,这似乎完全有可能,请告诉我。
谢谢!
答案 0 :(得分:3)
我认为没有一种很好的方法可以将myfunc
的参数与func1
和func2
的参数相关联。但是,您的示例可能有点过于简单,因为您可以写:
let myfunc x y =
func1 x y && func2 x y
我认为实际上,你有更多的函数,然后使用fold
很有意义。在这种情况下,您可以使用fold
来组合函数,而不是使用它来组合结果。
如果我稍微简化问题并假设func1
和func2
将两个参数作为元组(而不是将它们作为两个单独的参数),那么你可以这样写:
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 ]
现在您不需要显式传递参数(func1
和func2
),但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
。如果你需要这样做,那么我认为你的版本非常易读且不会太久。我在这个答案中写的例子表明你可以避免手工传递参数,但这会使代码有点神秘。