【问题标题】:OCaml, function returning TupleOCaml,函数返回元组
【发布时间】:2015-11-08 21:35:41
【问题描述】:

我已经定义了 4 个函数,它们返回一个类型为 (int * int) 的元组,如下所示 所有这些功能都经过测试。

let f1 (p1, p2, p3, p4) =
 if <condition> then p1
 ....
 else p4

如何定义一个函数,使用这 4 个函数的输出来返回类型为 (int * int, int * int, int * int, int * int) 的元组

let test(p1, p2, p3, p4) =
  (f1(p1, p2, p3, p4), f2(p1, p2, p3, p4), f3(p1, p2, p3, p4), f4(p1, p2, p3, p4))

OCaml interpeter 给了我一个语法错误,它并没有真正告诉我任何事情。

【问题讨论】:

  • 如果没有实际的错误消息就很难判断(拥有功能代码也有帮助)。附带说明一下,因为您总是将 (p1, p2, p3, p4) 作为一个整体传递给 f1 .. f4 您可以简化它 test ps = f1 ps, f2 ps, f3 ps, f4 ps
  • 谢谢,我刚刚意识到我错过了函数定义末尾的第二个分号。现在工作
  • “这并没有告诉我任何事情”所以你知道我们的感受

标签: ocaml


【解决方案1】:

我认为您在此处显示的代码没有任何问题。很可能您必须显示更多代码。从编译器中查看具体错误也将有所帮助。

这是一些返回 3 对的代码(只是为了使示例更小):

# let f (x, y) = (x + 1, y + 1);;
val f : int * int -> int * int = <fun>
# let g (x, y) = (f (x, y), f (x, y), f (x, y));;
val g : int * int -> (int * int) * (int * int) * (int * int) = <fun>

【讨论】:

    【解决方案2】:

    函数 f1 不会返回你想到的类型 (int * int) 而是 int :

    # let f1 (p1, p2, p3, p4) = if true then p1+1 else p4+1;;
    val f1 : int * 'a * 'b * int -> int = <fun>
    

    例如,如果您有:

    let f1 (p1, p2, p3, p4) = (p1+1,p2+1);;
    let f2 (p1, p2, p3, p4) = (p1+1,p2+1);;
    let f3 (p1, p2, p3, p4) = (p1+1,p3+1);;
    let f4 (p1, p2, p3, p4) = (p1+1,p4+1);;
    

    您可以毫无错误地定义您的功能测试:

       # let test(p1, p2, p3, p4) = (f1(p1, p2, p3, p4), f2(p1, p2, p3, p4), f3(p1, p2, p3, p4), f4(p1, p2, p3, p4));;
    val test :
      int * int * int * int ->
      (int * int) * (int * int) * (int * int) * (int * int) = <fun>
    

    你也可以写:

    let test nuplet = (f1 nuplet, f2 nuplet, f3 nuplet, f4 nuplet);;
    

    【讨论】:

      【解决方案3】:

      这就是函数定义末尾缺少分号(第二个)的情况。这对我来说是一个愚蠢的问题。对不起

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-09-30
        • 2013-10-28
        • 1970-01-01
        • 1970-01-01
        • 2011-07-27
        • 2014-01-02
        • 1970-01-01
        相关资源
        最近更新 更多