我是Ocaml的新手,我正在试图弄清楚这个功能是如何工作的:
let ccc c1 c2 c3 = fun (s1, s2, s3) n ->
let (t1, r1) = (c1 s1 2) in
if r1 = 0
then let (t2, r2) = (c2 s2 n) in ((t1, t2, s3), r2)
else let (t3, r3) = (c3 s3 n) in ((t1, s2, t3), r3) ;;
c1, c2, c3
都是“选择者”。我知道这个函数的目的是让3个选择器进入并让第一个选择器选择使用其他两个选择器中的哪个,但我对语法感到困惑。有人可以解释一下吗?谢谢!
答案 0 :(得分:3)
如果不知道哪个部分令人困惑,很难回答。以下是一些简单的例子,展示了一些棘手的部分。
# let f = fun x -> x + 1;;
val f : int -> int = <fun>
# f 3;;
- : int = 4
这将f
定义为将一个加到整数的函数。表达式fun args -> expr
定义了一个函数,let
将函数绑定到名称f
。
# let f x = x + 1
val f : int -> int = <fun>
# f 3;;
- : int = 4
这定义了相同的函数f。意思是完全相同的,它只是一个稍微友好的符号。
无论出于何种原因,您的代码都使用这两种符号。我不确定我是否有充分的理由这样做,但它强调的是,如果你将三个函数传递给ccc
,你将得到一个函数。
其他部分非常简单(尽管可能需要一些时间来适应):
只是通过彼此相邻的方式形成函数调用:
c1 s1 2
c2 s2 n
c3 s3 n
这些只是对c1
,c2
和c3
的来电。
使用逗号形成元组(并且通常也使用括号)。因此,(t1, r1)
是调用c1
返回的一对值。
我认为您了解if
/ then
/ else
和let
in
。如果没有,他们就不难解释了。
我实际上建议您阅读有关OCaml的教程。它应该比在SO上一次提出一个问题更有效率。 ocaml.org有很好的教程。