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

问题描述

这里是《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”中定义的函数,或者haskell中的where和let,应该是“私有的”,就像oo语言一样,应该是函数中用到的“工具函数”。

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

解决方法

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

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

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