如何在OCaml中组合两个功能?

时间:2014-04-24 00:23:12

标签: ocaml

let rec test a b  = 
    match a with
    |[] -> []
    |(e,r)::tails -> if b = e then r::(test tails b)
                         else test tails b

let test2 g =
    match g with
    |e,r -> e, (test r)

我对上述两个功能有2个问题。

  1. test2正在调用test。如何将test放入test2,以便它成为一个函数?

  2. test2中,e,r ->e, (test r) - test行接受2个参数,但此处我们只传递r,那么此行的含义是什么?

1 个答案:

答案 0 :(得分:3)

鉴于问题2,我假设您没有编写这些函数。所以你得到了他们,因为他们的写得非常糟糕(参见下文),所以很难知道如何回答你的问题......无论如何:

1。首先,请注意,在许多情况下,保留两个单独的函数会使代码更易于阅读,维护,重用等...也就是说,可能有两种方法可以实现:

  • 您可以在test内定义test2。在这种情况下,你会写(保持你的testtest2的定义):

    let test2 g =
      let rec test a b  = 
        match a with
        |[] -> []
        |(e,r)::tails -> if b = e then r::(test tails b)
                         else test tails b
      in
      match g with
      |e,r -> e, (test r)
    
  • 或者,您可以重写该函数,以便它执行所有操作,但通常会使代码不太清晰 - 在您的情况下,我认为它没有用。

    < / LI>

2。 test r只是部分应用:它是一个函数,当给定一个参数b时,它将返回test r b。您应该阅读:http://en.wikipedia.org/wiki/Currying(虽然我不确定该主题的最佳介绍)

3。由于多种原因,您提供的功能写得很糟糕。以下是其中一些:

  • test不是tailrec,当它很容易(如果你不知道什么是tailrec意味着,暂时忘掉它)
  • 名字的选择不是很好 - 所以很难知道是什么。
  • 可以简化一些表达式。例如,你可以写:

    let test2 (e, r) = (e, test r)
    

希望对你有所帮助! =)