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

我不知道 F# 中所有不同的运算符和技术,但希望我可以用一些运算符代替 func1 和 func2 的“x y”,以向他们指示“只需使用我的参数”,就像组合如何具有隐式参数一样通过。

或者,如果有人能想到一种更直接、更简洁的方法来消除我的函数将其参数提交的需要,请告诉我。

另外,如果这似乎完全不可能,请告诉我。

谢谢!

4

1 回答 1

3

我不认为有一种很好的方法可以将 的参数线程化myfuncfunc1and的参数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 ] 

现在您不需要显式地传递参数(tofunc1func2),但是 的参数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。如果您需要这样做,那么我认为您的版本非常可读且不会太长。我在此答案中编写的示例表明您可以避免手动传递参数,但这会使代码有点晦涩难懂。

于 2012-08-22T15:16:36.090 回答