Ocaml 尾部递归错误:表达式的类型为int,但表达式的类型应为unit
我刚开始在学校的一门课上使用OCaml函数式编程语言编程。我们的问题之一是编写所谓的“俄罗斯农民算法”,但使用尾部递归代替常规递归。我想我已经差不多明白了,但我一直遇到一个愚蠢的错误,我似乎无法准确指出;“此表达式的类型为int,但表达式的类型应为 单元“在线路上”辅助x(基本*基本)(电源/2)。我真的不知道如何着手解决这个问题,因为我对这种语言的语法还不熟悉。有什么想法吗 我相信这是由一个没有分支的有条件的组织造成的;然而,我已经实现了这个,所以我很困惑为什么它不工作Ocaml 尾部递归错误:表达式的类型为int,但表达式的类型应为unit,ocaml,Ocaml,我刚开始在学校的一门课上使用OCaml函数式编程语言编程。我们的问题之一是编写所谓的“俄罗斯农民算法”,但使用尾部递归代替常规递归。我想我已经差不多明白了,但我一直遇到一个愚蠢的错误,我似乎无法准确指出;“此表达式的类型为int,但表达式的类型应为 单元“在线路上”辅助x(基本*基本)(电源/2)。我真的不知道如何着手解决这个问题,因为我对这种语言的语法还不熟悉。有什么想法吗 我相信这是由一个没有分支的有条件的组织造成的;然而,我已经实现了这个,所以我很困惑为什么它不工作 let even n
let even n = (n mod 2) = 0 ;;
let odd n = (n mod 2) = 1;;
let exp_program (base, power) =
let rec func x base power =
if base = 0 then 0
else if power = 0 then x
else if power = 1 then x*base
else if (odd power) then
func (x*base) (base*base) ((power-1)/2)
else if (even power) then
func x (base*base) (power/2)
in
func 1 base power ;;
这个函数的目标是调用exp_程序(2,3),例如,让它产生基本的^power。在这种情况下,它将导致8您缺少
else
子句
解决方案:删除最后一个else if
,并替换为else
let exp_program (base, power) =
let rec func x base power =
if base = 0 then 0
else if power = 0 then x
else if power = 1 then x*base
else if (odd power) then
func (x*base) (base*base) ((power-1)/2)
else
func x (base*base) (power/2)
in
func 1 base power ;;
构造
if <boolean> then <expression>
您的if中的最后一个if
。。。否则如果。。。否则如果。。。else if
梯形图就是这样一个构造,因此具有隐式的else()
。类型推断类向后工作,因此首先看到()
的隐式返回,然后将unit推断为if的返回类型。然而,then
分支的类型为int,因此您可以得到所描述的错误
解决此问题的最简单方法是将最后一个else if
替换为justelse
。这也节省了时间,因为你知道功率是偶数,因为它不是奇数
else ()