2017-06-14 56 views
0

我已經做了一些搜索,而且這個問題是另一篇文章的重複。我張貼這只是爲了將來的參考。在F#中沒有變量的SUMPRODUCT

是否可以在不明確使用變量名稱x,y的情況下定義SUMPRODUCT?

原函數:

let SUMPRODUCT x y = List.map2 (*) x y |> List.sum 
SUMPRODUCT [1;4] [3;25] // Result: 103 

我希望能做到這一點:

// CONTAINS ERROR! 
let SUMPRODUCT = (List.map2 (*)) >> List.sum 
// CONTAINS ERROR! 

但F#回來了一個錯誤。

我已經在另一篇文章中找到了解決方案,但如果您有任何建議,請告訴我。謝謝。

回答

2

函數組合僅在輸入函數接受單個參數時才起作用。然而,在你的例子中,List.map2 (*)的結果是一個函數,它帶有兩個單獨的參數,所以它不能用10和List.sum組成。

如果你真的想要解決這個問題有很多種方法,但我不會那樣做。我認爲>>在少數情況下很不錯,但很適合,但試圖過度使用會導致難以理解的混亂。

在一些函數式語言中,核心庫定義了helpers,用於將帶有兩個參數的函數轉換爲帶有元組的函數,反之亦然。

let uncurry f (x, y) = f x y 
let curry f x y = f (x, y) 

你可以使用這兩個定義你sumProduct這樣的:

let sumProduct = curry ((uncurry (List.map2 (*))) >> List.sum) 

現在是自由點,並理解它是一個有趣的心理挑戰,但對於所有的實際目的,沒有人會能夠理解代碼,它也比您的原始顯式版本更長:

let sumProduct x y = List.map2 (*) x y |> List.sum