Ocaml语法解释好吗?

时间:2013-02-12 05:56:35

标签: syntax ocaml

我是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个选择器进入并让第一个选择器选择使用其他两个选择器中的哪个,但我对语法感到困惑。有人可以解释一下吗?谢谢!

1 个答案:

答案 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

这些只是对c1c2c3的来电。

使用逗号形成元组(并且通常也使用括号)。因此,(t1, r1)是调用c1返回的一对值。

我认为您了解if / then / elselet in。如果没有,他们就不难解释了。

我实际上建议您阅读有关OCaml的教程。它应该比在SO上一次提出一个问题更有效率。 ocaml.org有很好的教程。