为什么在let中定义的函数可以在函数外使用?

Why a function defined in let can be used outside of the function?

这是《compiling with continuations》一书中的代码,第 16 页(我重写了它 f#):

let (x,y)=
  let g(a,b:int,c)=a+c in
  (g,g(1,2,3))

所以x可以是let.

中定义的函数g

按照ml语法可能没问题,但在“工程实践”中,好像函数定义在一个函数的“let in”,或者where and let in Haskell,应该是“ private”,和o-o语言一样,应该是函数中使用的“工具函数”。

那么示例代码对吗?也许程序可以运行,但我认为这不是一个好的做法; ml 应该阻止它,比如使用“private”。

OCaml 中的函数是第一个 class 值。从函数返回函数没有问题

一切都被完美定义(本质上它具有 lambda 演算的语义)。当被视为一个值时,一个函数带有它需要的环境(即它是一个闭包)。

我个人认为返回函数比返回数据结构没有更多问题。如果您有使用 OCaml 的经验,您可能会开始以这种方式看待它。