我可以获得所有程序模块中不是函数的值列表吗?

时间:2017-12-13 23:37:03

标签: module f# namespaces

我的F#程序运行良好,但有时我发现很难理解流程。我定义了许多模块中不是函数的值。打开这些模块时,这些值将被绑定。我想获得一个非功能值的所有名称列表以及声明它们的模块。这可能吗?

以下示例可能会澄清问题。

module A =

    let i = 1
    let add x y = x + y


module B =
    let x = 99.9
    let sqr z = z * z

open A
open B

let y =
    add (float i) x 
    |> sqr

printfn "%f" y

是否有一个函数foo可以执行以下操作?

let nonFuncVals = foo()
printfn "%A" nonFuncVals
// ["A.i", "B.x"]

1 个答案:

答案 0 :(得分:2)

没有内置支持。根据你的工作方式,你可能会以一种黑客的方式做到这一点,但它可能会有很多限制。

以下是您的示例,当您使用F#interactive运行它时,但我确信它有很多方法可以破解:

open System.Reflection

let nonFuncVals () = 
  let special = set [ "it"; "CheckClose"; "LastGenerated" ]
  [ for t in Assembly.GetExecutingAssembly().GetTypes() do
      if t.FullName.StartsWith "FSI_" then
        for p in t.GetProperties() do
          if not (special.Contains p.Name) then
            if t.FullName.Length <= 8 then yield p.Name
            else yield t.FullName.Substring(9) + "." + p.Name ]
  |> Seq.distinct

nonFuncVals()

该函数查看当前定义的类型,并使用F#Interactive将生成的绑定放在名称为FSI_0001的类型中的事实。但是,这是未记录的行为,它可以在下一个版本中更改......