OCaml 表达式类型问题

Posted

技术标签:

【中文标题】OCaml 表达式类型问题【英文标题】:OCaml expression type issue 【发布时间】:2011-11-28 11:47:14 【问题描述】:

我正在尝试制作一个 OCaml 函数,它将字符串中的 'a' 的数量添加到给定的参数中。

let rec count_l_in_word (initial : int) (word : string) : int=
    if String.length word = 0 then initial else
    if word.[0] = 'a' then 
        count_l_in_word initial+1 (Str.string_after word 1)
    else count_l_in_word initial (Str.string_after word 1)

我在第 4 行收到一条错误消息,提示“此表达式的类型为 string -> int 但此处与 int 类型一起使用”。我不知道为什么它期望表达式'count_l_in_word initial+1'是一个int。它真的应该期望整行 'count_l_in_word initial+1 (Str.string_after word 1)' 是一个 int。

谁能帮忙解决这个问题

【问题讨论】:

【参考方案1】:
count_l_in_word initial+1 (Str.string_after word 1)

被解析为

(count_l_in_word initial) + (1 ((Str.string_after word) 1))

所以你需要添加一些括号:

count_l_in_word (initial + 1) (Str.string_after word 1)

【讨论】:

谢谢,我想我必须小心优先。我让它工作了 IIRC 的规则是函数应用的优先级高于任何运算符。这在 FP 语言中很常见。 不会被解析成(count_l_in_word initial) + (1 ((Str.string_after word) 1))吗? @newacct:你是对的。我没想到解析器会生成一个以1 作为函数的函数应用程序:)

以上是关于OCaml 表达式类型问题的主要内容,如果未能解决你的问题,请参考以下文章

Ocaml 类型不匹配?预期单位,但为已定义类型

如何在ocaml中将字符串转换为整数列表?

核心 OCaml 中浮点数的绝对值

为啥 OCaml 有时需要 eta 扩展?

OCaml:在另一个内部匹配表达式?

在 Ocaml 中编写 Z 组合器