1

在以下 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 });
    ]
  ...
4

1 回答 1

1

不,此功能在 F# 中不可用。您只能使用以下方法进行顶级模块缩写(如您所说):

module F = Command.Flag

您可以将它们写在源文件的中间,但它们必须位于顶层,并且它们的范围始终是直到文件末尾(或直到另一个隐藏的定义F)。也许如果你使用它,然后有另一个定义hidden F,它会产生类似的效果。例如:

module L = List
[0 .. 9] |> L.map ((*) 2) // Uses functional `List.map`

module L = Seq    
[0 .. 9] |> L.map ((*) 2) // Uses lazy `Seq.map`

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

于 2012-09-30T22:03:26.993 回答