4

我正在学习 OCaml,这是我的第一种类型语言,所以请耐心等待:

为了练习,我试图定义一个函数“除法?” 它输入两个整数并输出一个布尔值,描述“int a”是否均匀划分为“int b”。在我的第一次尝试中,我写了这样的东西:

let divides? a b =
if a mod b = 0 then true
else false;; 

这给出了类型错误:

if a mod b = 0 then true
  ^
Error: This expression has type 'a option
       but an expression was expected of type int

所以然后我试图扭转它,我这样做了:

let divides? a b =
 match a mod b with
  0 -> true
 |x -> false;;

这没有多大帮助: Characters 26-27 match a mod b with ^ Error: This expression has type 'a option but an expression was expected of type int

然后我尝试了这个:

let divides? (a : int) (b : int) =
 match a mod b with
 0 -> true
|x -> false;;

这引发了这一点:字符 14-15:让划分?(a : int) (b : int) = ^ 错误:此模式匹配 int 类型的值,但预期的模式匹配 'a 选项类型的值。

我现在对一般的类型系统感到非常困惑和沮丧。(我的第一语言是Scheme,这是我的第二语言。)任何解释我哪里出错的帮助以及如何解决它的建议都非常感谢。

4

1 回答 1

12

问题是您不能在 OCaml 的变量/函数名称中使用问号字符?。它实际上是这样解析你的函数声明的:

let divides ?a b =
   if a mod b = 0 then true
   else false

请注意,问号实际上是影响 的类型a,而不是函数名称的一部分。

这意味着a是一个可选参数,因此它被分配了'a optionsome的类型'a

尝试从名称中删除问号。

于 2012-07-05T23:00:21.187 回答