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

Mat*_*hew 3 f# tuples list

我正在用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是一个术语列表

Car*_*ten 6

好的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)

你应该更好地理解它:

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

  • 你可以看到`withTuple`的(有点可怕)签名的最后一点:`a:'a*b:'a - > op :('a - >'b - >'c) - >(('b*'b)list - >('c*'c)list)` - `('b*'b)list - >('c*'c)list`将是结果,这又是一个函数 (2认同)
  • 如果我添加参数`tpls`,我现在做的将是:`a:'a*b:'a - > op :('a - >'b - >'c) - > tpls :('b*'b)list - >('c*'c)list`真的是相同的(减去现在命名的参数和缺少的`(...)`对...但是你应该总是认为''a - > 'b - >'c ='a - >('b - >'c)`) (2认同)