过滤器上的OCaml语法错误

时间:2014-02-18 21:24:40

标签: recursion syntax-error ocaml

我今天刚刚开始OCaml(和函数式编程),我正在尝试编写一个函数来计算数组中出现的“value”数量(tab)。 我试过了:

let rec count_occ tab value =
    let rec count_rec idx time = function
        | tab.length - 1 -> time
        | _ when tab.(indice) == value-> count_rec (idx + 1) (time + 1)
        | _ -> count_rec (indice + 1) time
    in
    count_rec 0 0
;;

不幸的是,由于语法错误,它无法编译,我找不到解决方案。

2 个答案:

答案 0 :(得分:3)

let rec count_occ tab value =

上面的补充不是必需的。

    let rec count_rec idx time = function
        | tab.length - 1 -> time

您无法与表达式匹配。您希望像下一行一样使用警卫,或if语句来测试这样的事情。 tab.length也不存在,因为tabarray,而不是length字段的记录。你想要Array.length tab

但实际上,你根本不需要functionfunctionfun x -> match x with相同,并暗示count_rec的类型为int -> int -> int -> int

        | _ when tab.(indice) == value-> count_rec (idx + 1) (time + 1)
未宣布

indices;我假设你的意思是idx。此外,==是物理上的平等,你真的想要=

        | _ -> count_rec (indice + 1) time
    in
    count_rec 0 0

你有一个良好的开端,你的递归的基础知识是正确的,虽然一个边缘情况是不正确的,但一旦你修复了语法问题你应该能够解决一个小问题。

答案 1 :(得分:1)

最后我发布了我的最终代码:

let count_occ tab value =
    let rec count_rec idx time =
        if (Array.length tab) = idx then
            time
        else if (tab.(idx)) = value then
            count_rec (idx + 1) (time + 1)
        else
            count_rec (idx + 1) time
    in
    count_rec 0 0
;;