2012-07-20 79 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