OCaml类型错误

4
我正在学习OCaml,这是我接触的第一种类型语言,希望您能耐心指导:
为了练习,我尝试定义一个名为“divides?”的函数,该函数输入两个整数并输出一个布尔值,描述“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;;

这并没有帮助太多:

在第26-27个字符处,用match a mod b进行匹配, ^ 错误:该表达式的类型为'a option, 但是需要一个int类型的表达式

然后我尝试了这个:

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

引发了以下错误: 字符14-15: let divides? (a : int) (b : int) = ^ 错误:此模式匹配的类型为int,但需要一个匹配'a option类型的模式。

对于类型系统我感到非常困惑和沮丧。(我的第一门语言是Scheme,这是我的第二门。)希望能得到帮助,解释我错在哪里,并提出修复建议,谢谢。


1
(与大多数编程语言一样,您可以将“if <expr> then true else false”替换为“<expr>”。这只是需要记住的一些事情。) - Jeffrey Scofield
1个回答

12
问题在于在OCaml中不能在变量/函数名中使用问号字符?。实际上,它会解析您的函数声明如下:
let divides ?a b =
   if a mod b = 0 then true
   else false

请注意,问号实际上影响的是a的类型,而不是函数名称的一部分。
这意味着a是一个可选参数,因此它被赋予了'a option类型的某些'a'值。
尝试从名称中删除问号。

非常感谢!!!我都快疯了,查阅教科书,在互联网上浏览每一个网站寻找答案...谢谢。 - Balthasar
没问题,很高兴我们能帮到你! - Asherah

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接