syntax - 尝试定义内部函数时出现语法错误
问题描述
我有这个功能
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 ,仍然不起作用。怎么了?
解决方案
如果你会使用一些自动缩进工具来缩进你的代码(强烈推荐的做法),那么你的代码问题就会变得很明显,例如,这是你的代码在通过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) ) 最接近其他一些语言中的命名语句的东西
推荐阅读
- angular - 如何在ionic4中为电容器设置本地存储
- java - 如何从 HashMap 中的 HashMap 获取 Set
- javascript - matter.js 空白屏幕,没有加载
- flutter - 添加边距时,BottomAppBar CircularNotchedRectangle 未居中
- swiftui - SwiftUI如何显示弹出框
- dask - 长时间运行的工作人员阻止 GIL 超时错误
- jquery - Heroku 部署错误:无法解析 jquery
- rest - Rest API 设计:为什么路径变量比正文更受青睐
- list - dart 中的列表映射实际上是如何工作的?
- angular - 在通用组件中呈现输入组件的简单方法