0

我是 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 个选择器,让第一个选择器选择要使用的其他两个选择器中的哪一个,但我对语法感到困惑。谁能解释一下?谢谢!

4

1 回答 1

3

不知道哪个部分令人困惑,很难回答。这里有一些简单的例子,展示了一些比较棘手的部分。

# let f = fun x -> x + 1;;
val f : int -> int = <fun>
# f 3;;
- : int = 4

这定义f为一个将整数加一的函数。该表达式fun args -> expr定义了一个函数,并将let该函数绑定到 name 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

这些只是对c1c2和的调用c3

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

我假设你理解if//thenelse. let in如果不是,它们并不难解释。

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

于 2013-02-12T06:16:44.597 回答