我在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)
其中term是float * int的元组,poly是术语列表
答案 0 :(得分:6)
好的List.map
是一个好主意 - 你只需要确保提供一些东西(比方说一个lambda)来告诉F#如何对两个元组进行操作。
为了使它更通用,你可以这样做:
let withTuple (a,b) op tpls =
List.map (fun (a',b') -> (op a a', op b b')) tpls
按照预期使用
> 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)]
要了解它应该更好一点:
op
函数)withTuple (2.0,1) (*) [(2.1,3);(4.2,5)]
不起作用?(+)
不适用于所有数字?)