【问题标题】:Why a function defined in let can be used outside of the function?为什么 let 中定义的函数可以在函数外使用?
【发布时间】:2021-04-03 09:15:13
【问题描述】:

这是《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”。

【问题讨论】:

  • “私有”保护与范围一样,适用于名称,而不适用于值。您应该能够在函数是“一流”值的“OO”语言中做同样的事情。

标签: f# ocaml sml ml


【解决方案1】:

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

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

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

【讨论】:

  • 除了这个答案之外,我还要添加一件似乎使操作感到困惑的事情。变量 xy 已经在顶级范围内,所以我们正在做的是在内部 let 范围内定义一个函数 g 并将该函数(此处为 g)作为要绑定的值返回顶级x
猜你喜欢
  • 1970-01-01
  • 2012-01-13
  • 2020-06-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-20
  • 2011-03-20
相关资源
最近更新 更多