OCaml实现Ackermann函数报This is not a function错误如何解决
错误原因
你遇到的是OCaml的静态类型检查错误,触发核心是错误将整数类型的值当做函数进行调用,你的代码里共有两处同类错误:
n=0分支的acker ((m - 1) 1)写法错误:(m - 1)是计算得到的整数,你在后面直接跟1,会被编译器判定为「把m-1这个整数当函数,传入参数1执行调用」,不符合语法规则。- 最后一个分支的
acker ((m - 1) acker (m (n - 1)))存在两个错误:一是m (n - 1)同样把整数m当成了函数调用;二是参数嵌套的括号逻辑完全不符合Ackermann函数的定义要求。
修复方案
OCaml的多参数函数调用不需要把所有参数整体括在括号里,仅当单个参数是复合表达式时,才需要用括号把该参数单独括起来避免优先级混淆。
按照Ackermann函数的标准定义,修复后的代码如下:
let rec acker m n = if m = 0 then n + 1 else if n = 0 then acker (m - 1) 1 else acker (m - 1) (acker m (n - 1));;
内容的提问来源于stack exchange,提问作者leragan
相关产品推荐
相关产品推荐

