【问题标题】:Adding two tuples in F#在 F# 中添加两个元组
【发布时间】:2020-09-15 19:10:53
【问题描述】:

试图理解 F# 中的元组..

当前的思考过程

let add tuples a b = 
let a = (_,_)
let b= (_,_)
(a+b)

由于“_”对这种情况无效,所以这不起作用,所以我想尝试

let add tuples a b =
let a = (c,d)
let b = (e,f)
fst a + fst b, snd a + snd b;;

这不起作用,因为 c,d,e,&f 不是已知变量。在 java 中,我传统上只是初始化该变量以便可以使用它,但在 F# 中这似乎有点时髦let a= int 甚至不确定这是否会起作用

任何有关尝试修复我的思维过程的帮助将不胜感激。谢谢

编辑:

预期结果

a (1,3) b (2,4) 返回 (3,7)

【问题讨论】:

    标签: f# tuples


    【解决方案1】:

    有两种方法可以访问元组中的元素,您的代码似乎混淆了它们。首先,您可以在二元素元组上使用fstsnd。你实际上有这个权利,但你需要删除其他不必要的行 - ab 是元组,所以你可以只写:

    let add a b =
      fst a + fst b, snd a + snd b
    

    另一种选择是使用模式匹配。为此,您需要将元组值(即ab)分配给定义新变量(如(c, d))的模式。使用模式匹配执行上述操作如下所示:

    let add a b =
      let (a1, a2) = a
      let (b1, b2) = b
      a1 + b1, a2 + b2
    

    模式可以像上面那样出现在独立的let 绑定中,但您也可以直接在函数的参数中使用它们 - 因此您可以将其缩写为:

    let add (a1, a2) (b1, b2) = 
      a1 + b1, a2 + b2
    

    【讨论】:

    • 谢谢!我正在从 Java 迁移到 F#,缺少所需的声明一直令人困惑,但这有助于理清一些问题。
    • @huffola 如果向函数添加显式类型签名,您可能会发现它更容易。即let add (a:int) (b:int) : int*int = fst a + fst b, snd a + snd b 以后您可以随时删除它们以用于样式或因为它们限制使用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-09
    • 1970-01-01
    • 2023-04-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多