2012-07-20 76 views
1

元組函數給出有兩個參數的函數:部分申請使用List.map

let f (a:int) (b:int) : string = sprintf "%d %d" a b 

和元組的列表:

let myList = [(1,2) ; (3,3)] 

如何使用部分應用的元組操作(||>)一張地圖?

myList |> List.map ((||>) f)   //doesn't work 
myList |> List.map (fun x -> (||>) x f) //boring 

看來我需要反轉||>需要的參數。

+0

是|| >自定義運算符?我沒有看到它在F#符號和運算符參考http://msdn.microsoft.com/en-us/library/dd233228.aspx – 2012-07-20 15:35:16

+1

@MarkPattison是一個內置的運算符'('a *'b - >('a - >'b - >'c) - >'c)' – 2012-07-20 15:44:05

+1

@Mark:請參閱http://msdn.microsoft.com/en-us/library/ee340237.aspx – ildjarn 2012-07-20 16:20:08

回答

10
myList |> List.map ((<||) f) 
6

那麼,使用(<||)作爲@desco做的是最簡單的答案。您可以在點自由式使用uncurry容易寫:

let inline uncurry f (x, y) = f x y 
myList |> List.map (uncurry f) 

或更離奇內置的功能:

myList |> List.map ((|>) f << (||>)) 

證明:

(|>) f << (||>) 
<=> fun x -> ((|>) f << (||>)) x 
<=> fun x -> ((|>) f) ((||>) x) 
<=> fun x -> (|>) f ((||>) x) 
<=> fun x -> f |> ((||>) x) 
<=> fun x -> (||>) x f 
+0

這真的做得很好 – 2012-07-20 18:37:14