Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ocaml 尾部递归错误:表达式的类型为int,但表达式的类型应为unit_Ocaml - Fatal编程技术网

Ocaml 尾部递归错误:表达式的类型为int,但表达式的类型应为unit

Ocaml 尾部递归错误:表达式的类型为int,但表达式的类型应为unit,ocaml,Ocaml,我刚开始在学校的一门课上使用OCaml函数式编程语言编程。我们的问题之一是编写所谓的“俄罗斯农民算法”,但使用尾部递归代替常规递归。我想我已经差不多明白了,但我一直遇到一个愚蠢的错误,我似乎无法准确指出;“此表达式的类型为int,但表达式的类型应为 单元“在线路上”辅助x(基本*基本)(电源/2)。我真的不知道如何着手解决这个问题,因为我对这种语言的语法还不熟悉。有什么想法吗 我相信这是由一个没有分支的有条件的组织造成的;然而,我已经实现了这个,所以我很困惑为什么它不工作 let even n

我刚开始在学校的一门课上使用OCaml函数式编程语言编程。我们的问题之一是编写所谓的“俄罗斯农民算法”,但使用尾部递归代替常规递归。我想我已经差不多明白了,但我一直遇到一个愚蠢的错误,我似乎无法准确指出;“此表达式的类型为int,但表达式的类型应为 单元“在线路上”辅助x(基本*基本)(电源/2)。我真的不知道如何着手解决这个问题,因为我对这种语言的语法还不熟悉。有什么想法吗

我相信这是由一个没有分支的有条件的组织造成的;然而,我已经实现了这个,所以我很困惑为什么它不工作

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
替换为just
else
。这也节省了时间,因为你知道功率是偶数,因为它不是奇数

else ()