2012-08-22 31 views
1
let myFunc x y = 
    List.fold (&&) true [func1 x y; func2 x y] 

我不知道F#中所有不同的运算符和技巧,但希望我可以用一些运算符代替“xy”作为func1和func2来向他们表明“只要带上我的参数”,就像组合具有隐式参数传递一样。如何从函数到函数干净地传递参数(如组合)

另外,如果有人可以想到一个更简单,干净的方法来摆脱我的函数需要传递参数的功能,请告诉我。

此外,如果这是不可能的,这似乎是完全可能的,让我知道。

谢谢!

+1

相关:http://stackoverflow.com/q/10854010/162396 – Daniel

+0

我也看到了S combinator,有趣的是要了解它真正有用的地方在于它的组成。 –

回答

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。如果您需要这样做,那么我认为您的版本非常易读,不会太长。我在这个答案中写的例子表明,你可以避免手工传递参数,但它使代码有点神秘。

+0

我想,如果我以某种方式添加另一层间接寻址,我可以让它工作。是的,我认识到它可以作为你的第一个例子被简化,但我有更多的功能来测试。感谢这个,我不得不坐在它上面来理解参数是如何与你的例子进行线程化的。 –

+0

我在那里看到S和K combinators ..我真的不知道人们如何知道何时使用这些参数。尽管我可以使用它们,但我见过的唯一combinator认出了一个地方是B .. –

+0

所以我的外卖在这里,它可以完成,但变得一团糟。太具体的实施要重复使用,太多的实施一个用例,所以坚持我的方法。 –