我的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"]
答案 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
的类型中的事实。但是,这是未记录的行为,它可以在下一个版本中更改......