OCaml:尝试计算字符串中char的频率

时间:2016-10-13 00:21:12

标签: count ocaml frequency

let countA =0 in
let countC =0 in
let countG =0 in
let countT =0 in
let countChar x =
  match x with 
  'A' -> countA = countA + 1
  |'C'-> countC = countC + 1
  |'G' -> countG = countG + 1
  |'T'-> countT = countT + 1
;;

我收到语法错误,但我不明白为什么,我仍然是Ocaml的新手。

1 个答案:

答案 0 :(得分:2)

您的语法错误是由于您的上一个let之后没有in这一事实造成的。反过来,这是由于countChar函数未在(模块的)最外层定义的事实引起的。如果要定义一系列顶级名称,则应在不使用in的情况下定义它们:

let countA = 0
let countC = 0
let countChar x = ...

那么,这就是你的语法问题。但是,此代码还有许多其他问题。

最明显的两个是(A)您希望能够更改countA的值,依此类推。但它们是不可改变的价值观,你无法改变它们。 (B)您正在使用=,就像它是一个赋值运算符一样。但在OCaml中,这是一个比较运算符。您的代码只是 countAcountA + 1进行比较。所以当然结果是false

绝对值得学习如何使用不可变值进行计算,因此我将尝试通过学习如何将累积计数作为函数参数进行计算来修复此代码,并在最后返回它们。但是,如果你坚持要求编码,那么你必须使用引用来计算你的数量。

我也没有看到任何适用于字符串的代码。您的countChar函数(顾名思义)仅适用于一个字符。

<强>更新

这是一个函数,用于计算数组中出现的偶数和奇数个数。它的工作原理没有变异:

let eoa array =
    let rec inner n (evenct, oddct) =
        if n >= Array.length array then
            (evenct, oddct)
        else
            let newcounts =
                if array.(n) mod 2 = 0 then (evenct + 1, oddct)
                else (evenct, oddct + 1)
            in
            inner (n + 1) newcounts
     in
     inner 0 (0, 0)

以下是您运行时的外观:

# eoa [| 3; 1; 4; 1; 5; 9; 2 |];;
- : int * int = (2, 5)