问题描述
这里是《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 的经验,您可能会开始以这种方式看待它。