是否可以在函数或值绑定中使用F#模块缩写?

时间:2012-09-30 22:00:31

标签: f#

在以下ML提取(取自Effective ML talk)中,值绑定表达式中有一个模块缩写。是否有可能在F#中做同等的事情? 我知道你可以做模块缩写,我特别感兴趣的是你可以像这样“内联”吗。

let command =
  let default_config = { exit_code = 0; message = None } in
  let flags = 
    let module F = Command.Flag in
    [ F.int    "-r" (fun cfg v -> { cfg with exit_code = v });
      F.string "-m" (fun cfg v -> { cfg with message   = v });
    ]
  ...

1 个答案:

答案 0 :(得分:1)

不,此功能在F#中不可用。您只能使用:

执行顶级模块缩写(如您所说)
module F = Command.Flag

您可以在源文件的中间编写这些文件,但它们必须位于顶层,并且它们的范围始终一直持续到文件末尾(或直到另一个隐藏{{1}的定义为止。 })。也许如果你使用它然后有另一个定义隐藏 F,它会有类似的效果。例如:

F

我同意在许多情况下这将是一个有用的功能 - 另一方面,F#编程风格与ML有很大不同,因此有效ML谈话的建议可能无法直接映射到F#编程。如果您需要来创建本地定义,那么最好的选择是将其定义为F#对象。