我正在用F#编写一些代码,我需要乘以元组(c,d)的元组列表中的每个元素(a,b).
澄清,
(a,b)[(c,d),(e,f),(g,h)...][(a*c,b*d),(a*e,b*f),(a*g,b*h)...][(a+c,b+d),...]我试图用List.map一个元组乘以列表中的每个元素,但是我得到一个错误,它*是类型元组的无效运算符.
这就是我最终用模式匹配递归实现乘法函数的方法:
let rec mtp(t:term,p:poly):poly =
match (t, p) with
| (a,b),[] -> []
| (a, b),(c,d)::ps -> (a*c,b*d)::mtp(t,ps)
Run Code Online (Sandbox Code Playgroud)
其中term是float*int的元组,poly是一个术语列表
好的List.map是一个好主意 - 你只需要确保你提供一些东西(让我们说一个lambda)告诉F#如何操作两个元组.
为了使它更通用,你可以做这样的事情:
let withTuple (a,b) op tpls =
List.map (fun (a',b') -> (op a a', op b b')) tpls
Run Code Online (Sandbox Code Playgroud)
并按照您的预期使用它
> withTuple (1,1) (+) [(2,3);(4,5)];;
val it : (int * int) list = [(3, 4); (5, 6)]
> withTuple (2,1) (*) [(2,3);(4,5)];;
val it : (int * int) list = [(4, 3); (8, 5)]
Run Code Online (Sandbox Code Playgroud)
你应该更好地理解它:
op函数)withTuple (2.0,1) (*) [(2.1,3);(4.2,5)]不起作用 - 不(+)应该适用于所有数字?)