2012-08-22 30 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

所以我的外賣在這裏,它可以完成,但變得一團糟。太具體的實施要重複使用,太多的實施一個用例,所以堅持我的方法。 –