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

OCaml: trying to count frequency of char in a string

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 还是很陌生。

您的语法错误是由于您的最后一个 let 后面没有 in。反过来,这是由于您的 countChar 函数未在(模块的)最外层定义的事实引起的。如果要定义一系列顶级名称,则应将它们全部定义为不带 in:

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

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

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

绝对值得学习如何使用不可变值进行计算,因此我会尝试通过学习如何将累积计数作为函数参数并在最后 return 来修复此代码。但是如果你坚持命令式编码,你将不得不使用引用来计算你的计数。

我也没有看到任何适用于字符串的代码。您的 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)