用F#中的元组乘以元组列表

时间:2016-02-14 20:51:10

标签: list f# tuples

我在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是术语列表

1 个答案:

答案 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)]

要了解它应该更好一点:

  • 尝试找出签名(如果你愿意,可以使用F#/ F#Interactive)
  • 也许会尝试编写一个函数,其中元组的各个部分可以有不同的类型(提示:您需要多个op函数)
  • 为什么最后一个需要多个功能? (为什么withTuple (2.0,1) (*) [(2.1,3);(4.2,5)]不起作用?(+)不适用于所有数字?)