【问题标题】:Ocaml, understand a functionOcaml,了解一个函数
【发布时间】:2011-09-06 07:39:26
【问题描述】:

我在理解这个函数的工作原理时遇到了一些问题, 特别是我不明白关于最后一行的控制流程。 有人可以向我解释它的步骤,也许用伪代码?

    let traduit_pair a b =
            let a = traduit mark a in let b = traduit mark b in (a, b) in
    let (teq1, teq2, lneq) =
            let rec f l1 l2 l3 =
            (function
                 | [] -> ((Uplet l1), (Uplet l2), l3)
                 | EqualIF (a, b) :: fin ->
                     let (a, b) = traduit_pair a b
                     in f (a :: l1) (b :: l2) l3 fin
                 | NotEqualIF (a, b) :: fin ->
                         let (a, b) = traduit_pair a b
                     in f l1 l2 ((a, b) :: l3) fin)
            in f [] [] [] (List.rev condlst)

【问题讨论】:

  • 我不确定您所说的“关于最后一行的控制流”是什么意思。最后一行只是调用了前面几行定义的函数f
  • 我想说的是整个函数的控制流程,我不明白为什么最后一行有四个参数,返回值是什么。感谢您的评论。
  • 调用函数f给元组(teq1,teq2,lneq)赋值?
  • 是的。或者更具体地说:调用 f 并返回一个包含三个值的元组,然后将这三个值分别分配给变量 teq1teq2lneq

标签: recursion ocaml


【解决方案1】:

你的代码的一般流程是这样的:

首先定义函数traduit_pair。它接受两个参数 ab 并返回一对,其中包含将 traduit mark 应用于每个参数的结果。

那么变量teq1teq2lneq被定义为每个包含f [] [] [] (List.rev condlst)返回的三元组的一个元素,其中f定义如下:

首先让我们看看为什么f 的定义只命名了三个参数时可以用四个参数调用:你可能知道 ML 允许定义柯里化函数,而定义 let f x y = blabla 实际上只是 @987654332 的快捷方式@。

所以当我们谈论一个接受两个参数的函数时,我们实际上是在谈论一个接受一个参数并返回另一个接受另一个参数的函数。同样,一个接受三个参数然后返回另一个接受另一个参数的函数的函数与接受四个参数的函数是一样的。

f 的定义中使用的 function 关键字是创建函数的语法快捷方式,该函数接受参数和模式匹配。也就是说function | p1 -> e1 | p2 -> e2fun x => case x of | p1 -> e1 | p2 -> e2的快捷方式。所以let rec f l1 l2 l3 = function | p1 -> e1 | p2 -> e2let rec f l1 l2 l3 = fun l4 => case l4 of | p1 -> e1 | p2 -> e2是一样的,和let rec f l1 l2 l3 l4 = case l4 of | p1 -> e1 | p2 -> e2一样,很容易识别为一个接受四个参数的函数。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多