首页 > 解决方案 > 尝试定义内部函数时出现语法错误

问题描述

我有这个功能

let rec g (a:float) (b:int) : int = 
let rec func (x:float*char) (y:int) : float = 
   let (v,w) = x in
  let w' = int_of_char w in
  (func (float_of_int y, w) (g v w')) +. 2.1

我知道有一个问题是在某些情况下无法停止递归。(编译器会提示堆栈溢出错误)。但是我在编译时遇到了语法错误,我认为类型是正确的,我在函数名前添加了 rec ,仍然不起作用。怎么了?

标签: syntaxocaml

解决方案


如果你会使用一些自动缩进工具来缩进你的代码(强烈推荐的做法),那么你的代码问题就会变得很明显,例如,这是你的代码在通过ocp-indent之后的样子:

let rec g (a:float) (b:int) : int = 
  let rec func (x:float*char) (y:int) : float = 
    let (v,w) = x in
    let w' = int_of_char w in
    (func (float_of_int y, w) (g v w')) +. 2.1

所以,正如你所看到的,let rec func ...表达式是未完成的,它必须有in部分,但它没有。这是一个简单的模板,用于编写其中包含函数的函数,

let <outer-function-name> <outer-args> =
   let <inner-function-name> <inner-args> = 
       <inner-function-body> in
   <outer-function-body>

替换用您的代码分隔的部分<>您将让一切正常。

最有可能的是,问题的症结在于您混淆了以下两个句法结构:

let <var> = <exp>

let <var> = <exp> in <body>

他们通常很困惑,考虑到他们看起来有多相似,这并不奇怪。但是,它们非常不同。前者是一个定义1而后者是一个表达式。前者可能只出现在模块的顶层,而后者可能出现在任何需要表达式的地方。我知道这可能会令人困惑,因此您可能会从阅读我的其他答案中受益,我在其中给出了一些简单的示例来说明 OCaml 中的工作方式。


1) ) 最接近其他一些语言中的命名语句的东西


推荐阅读