2009-11-27 92 views

回答

6

與Chuck的答案&克里斯·史密斯評論剛要走,你可以寫

let digits = string_of_int >> String.length 
digits 9000;; // 4 
[1; 10; 100] |> List.map digits;; // [1;2;3] 

當你把那些成分&管道運營商與高階函數,你可以做複雜的東西非常簡潔:

let prodSqrtAbs = Seq.map (abs>>sqrt) >> Seq.reduce (*) 
prodSqrtAbs [| -9.0; 4.0 |];; // 6.0 

編輯:我剛剛閱讀了關於J及其隱式叉運算符。這非常強大。您可以在F#中構建等效的高階運算符,但它們不會隱式應用。因此,舉例來說,首先要定義lift(使用顯式參數)

let lift op a b x = op (a x) (b x) 

,然後應用它明確

let avg = lift (/) List.sum List.length 

得到的東西,你鏈接到維基百科的頁面上類似the J example。但它並不完全「默契」。

+0

嗨,加布裏埃爾。我可以問個問題嗎?在FSharp中缺少'隱式fork'運算符是否會迫使我只寫一個參數的默認函數(在元組/列表中打包參數等);但從來沒有讓我寫兩/三/四/ ..-參數默認函數? – Bubba88 2010-05-08 10:58:41

3

當然。所有你需要的是函數組合和咖喱,而這兩個都可以在F#中使用。

let compose f1 f2 = fun x -> f1 (f2 x);; 
let digits = compose String.length string_of_int;; 
digits 9000;; // 4 
+0

我已經寫了相反的方式,這樣它看起來像>>操作符。 – Benjol 2009-11-27 06:35:39

+0

F#有以下操作符來完成這類事情>>,<<, |>,<|, ||>。 – 2009-11-27 07:02:16

相關問題