Ocaml类型错误

Bal*_*sar 4 int ocaml types

我正在学习OCaml,这是我的第一种打字语言,所以尽量耐心等待我:

为了练习,我试图定义一个"分开"的功能?它输入两个整数并输出一个布尔值,描述'int a'是否均匀地划分为'int b'.在我的第一次尝试中,我写了这样的东西:

let divides? a b =
if a mod b = 0 then true
else false;; 
Run Code Online (Sandbox Code Playgroud)

给出了类型错误:

if a mod b = 0 then true
  ^
Error: This expression has type 'a option
       but an expression was expected of type int
Run Code Online (Sandbox Code Playgroud)

那么我试着扭转它,我这样做了:

let divides? a b =
 match a mod b with
  0 -> true
 |x -> false;;
Run Code Online (Sandbox Code Playgroud)

这没有多大帮助: 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;;
Run Code Online (Sandbox Code Playgroud)

引出这个:人物14-15:分开?(a:int)(b:int)= ^错误:此模式匹配int类型的值,但预期模式匹配类型'a option的值.

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

Ash*_*she 12

问题是您不能?在OCaml中的变量/函数名称中使用问号字符.它实际上正在解析你的函数声明,如下所示:

let divides ?a b =
   if a mod b = 0 then true
   else false
Run Code Online (Sandbox Code Playgroud)

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

这意味着a是一个可选参数,因此为它分配了'a option一些类型'a.

尝试从名称中删除问号.