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 中,这是一个比较运算符。您的代码只是 比较 countA
与 countA + 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)
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 中,这是一个比较运算符。您的代码只是 比较 countA
与 countA + 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)