我正在学习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.
尝试从名称中删除问号.