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个问题。
test2
正在调用test
。如何将test
放入test2
,以便它成为一个函数?
在test2
中,e,r ->e, (test r)
- test
行接受2个参数,但此处我们只传递r
,那么此行的含义是什么?
答案 0 :(得分:3)
鉴于问题2,我假设您没有编写这些函数。所以你得到了他们,因为他们的写得非常糟糕(参见下文),所以很难知道如何回答你的问题......无论如何:
1。首先,请注意,在许多情况下,保留两个单独的函数会使代码更易于阅读,维护,重用等...也就是说,可能有两种方法可以实现:
您可以在test
内定义test2
。在这种情况下,你会写(保持你的test
和test2
的定义):
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)
希望对你有所帮助! =)