【问题标题】:Multiplying a list of tuples by a tuple in F#将元组列表乘以 F# 中的元组
【发布时间】:2016-05-25 16:22:57
【问题描述】:

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

【问题讨论】:

  • 至少显示您尝试过的内容以及卡在哪里
  • 在 SO 上,您应该展示您已经尝试过的内容,以便 1. 我们不会为您做作业。 2. 这样我们就可以看到你是否有一个简单的错误很容易纠正。 3.让可能和你有相同想法的其他人知道他们是否和你有相同的想法。因为你没有尝试,所以我们大多数人不会给你答案。您还需要在 SO 中寻找答案,因为前几天刚刚给出了类似的答案,例如F# adding polynomials recursively
  • @GuyCoder 谢谢,我实际上在从哪里开始时遇到了麻烦!您为我提供的链接帮助很大!谢谢
  • 不必对新手(甚至似乎提供了他的真名)怀有敌意 - F# 社区曾经是 SO 周围更友好的社区之一,如果我们愿意,那不是很好欢迎新成员?毕竟它不像 F# 是主流之类的......
  • 据我所知,这个问题没有错!马修-我认为如果人们看到您的尝试(给您提到的错误的版本),人们会更高兴,即使它很简单并且不太有效。有时 StackOverflow 上的人们在看到没有代码的问题时会感到不安……我还编辑了您的问题,使其不包含“谢谢”和介绍(并且我修复了一些格式)。 StackOverflow 试图成为“纯粹的问答” - 所以感谢@GuyCoder 的更好方法是在评论中。最后,欢迎! :-)

标签: list f# tuples


【解决方案1】:

好的,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)] 不起作用 - (+) 不应该适用于所有数字吗?)

【讨论】:

  • 谢谢你,这真的很有帮助!
  • 只要确保你理解它! - 例如,我没有添加最后一个参数到List.map - 你知道为什么会这样吗?
  • 我现在正在交互式地玩代码@Carsten
  • 您可以看到withTuple 签名中的最后一点(有点吓人):a:'a * b:'a -> op:('a -> 'b -> 'c) -> (('b * 'b) list -> ('c * 'c) list) - ('b * 'b) list -> ('c * 'c) list 将是结果,这又是一个函数
  • 如果我像现在一样添加参数tpls,它将是:a:'a * b:'a -> op:('a -> 'b -> 'c) -> tpls:('b * 'b) list -> ('c * 'c) list,实际上是相同的(减去现在命名的参数和缺少的(...) 对......但是你应该一直想'a -> 'b -> 'c = 'a -> ('b -> 'c))
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多