RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 627029
Accepted
Ev_Hyper
Ev_Hyper
Asked:2020-02-13 05:20:29 +0000 UTC2020-02-13 05:20:29 +0000 UTC 2020-02-13 05:20:29 +0000 UTC

获取有关模块中函数的信息

  • 772

对如何获取有关模块包含的功能的信息的问题感兴趣。我想得到类似 FSI 问题的东西。

例如对于以下模块

module Test = 
    let ign _ = ()
    let getNowDateTime() = System.DateTime.Now
    let getNumbers count = [1..count]

FSI 显示此类信息

module Test = begin
  val ign : 'a -> unit
  val getNowDateTime : unit -> System.DateTime
  val getNumbers : count:int -> int list
end

我尝试通过反射获取数据如下

let getInfoAboutModule (t : Type) = 

    let genericToString (t : Type) = 
        match t.GenericTypeArguments with
        | [| |] -> t.FullName
        | x -> 
            x 
            |> Seq.map (fun x -> x.Name)
            |> String.concat "," 
            |> sprintf "%s<%s>" t.Name

    let getInfo (mi:MethodInfo) =
        let parameter = 
            let sb = System.Text.StringBuilder()

            for x in mi.GetParameters() do
                x.ParameterType
                |> genericToString
                |> sprintf "%s : %s ->" x.Name
                |> sb.Append
                |> ignore

            sb.ToString()
            |> fun str -> if str |> System.String.IsNullOrEmpty then "unit -> " else str

        sprintf "%s : %s %s" mi.Name parameter (genericToString mi.ReturnType) 

    t.GetMethods(BindingFlags.Public ||| BindingFlags.Static)
    |> Seq.map getInfo

对于模块,Test结果如下

ign : _arg1 :  -> System.Void
getNowDateTime : unit ->  System.DateTime
getNumbers : count : System.Int32 -> FSharpList`1<Int32>

MCVE (ideone)

但是,当然,通过这种方式我得到的名字与 F# 相去甚远。


PS 您不能向模块添加任何属性,因为 您需要保留从其他程序集的模块中提取数据的能力。

.net
  • 1 1 个回答
  • 10 Views

1 个回答

  • Voted
  1. Best Answer
    kmv
    2020-02-13T15:44:25Z2020-02-13T15:44:25Z

    您可以使用FSharp.Compiler.Service来解析模块源。如果模块已编译且其源代码不可用,那么我怀疑您能否获得比您的更好的结果。

    基于这个例子:

    open System
    open System.IO
    open Microsoft.FSharp.Compiler.SourceCodeServices
    
    let text =
        """
    module Test = 
        let ign _ = ()
        let getNowDateTime() = System.DateTime.Now
        let getNumbers count = [1..count]
        """
    
    let checker = FSharpChecker.Create()
    
    // из примера
    let parseAndTypeCheckSingleFile input = 
        let file = "test.fsx"
    
        let projOptions = 
            checker.GetProjectOptionsFromScript(file, input)
            |> Async.RunSynchronously
    
        let parseFileResults, checkFileResults = 
            checker.ParseAndCheckFileInProject(file, 0, input, projOptions) 
            |> Async.RunSynchronously
    
        // Wait until type checking succeeds (or 100 attempts)
        match checkFileResults with
        | FSharpCheckFileAnswer.Succeeded(res) -> parseFileResults, res
        | res -> failwithf "Parsing did not finish... (%A)" res
    
    // печать информации о члене модуля
    let printInfo (fn:FSharpMemberOrFunctionOrValue) =
        // строка с информацией о типе
        let rec getTypeString (t:FSharpType) =
            if t.HasTypeDefinition then
                let prms = [ for x in t.GenericArguments -> (getTypeString x) ] in
                    t.TypeDefinition.DisplayName +
                    " " +
                    String.Join(" ", prms)
            else
                t.ToString()
    
        printf "%s: " fn.DisplayName
    
        for group in fn.CurriedParameterGroups do
            for prm in group do
                match prm.Name with
                    | None -> () 
                    | Some name -> printf "%s:" name
                printf "%s -> " (getTypeString prm.Type)
    
        printf "%s\n" (getTypeString fn.ReturnParameter.Type)
    
    
    [<EntryPoint>]
    let main argv = 
        let parseFileResults, checkFileResults = 
            parseAndTypeCheckSingleFile text 
    
        let m = checkFileResults.PartialAssemblySignature.Entities.[0]
        let fns = m.NestedEntities.[0].MembersFunctionsAndValues
    
        for x in fns do printInfo x
    
        0
    

    结果:

    ign: type 'a -> unit
    getNowDateTime: unit  -> DateTime
    getNumbers: count:int  -> list int
    

    或者您可以直接研究来源FSI。


    如果在解析过程中出现错误,需要将文件复制FSharp.Core.optdata到FSharp.Core.sigdata程序所在的目录下。这些文件可以在%PROFRAMFILES%\Reference Assemblies\Microsoft\FSharp\.NETFramework\v4.0\4.4.0.0\.

    • 4

相关问题

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    Python 3.6 - 安装 MySQL (Windows)

    • 1 个回答
  • Marko Smith

    C++ 编写程序“计算单个岛屿”。填充一个二维数组 12x12 0 和 1

    • 2 个回答
  • Marko Smith

    返回指针的函数

    • 1 个回答
  • Marko Smith

    我使用 django 管理面板添加图像,但它没有显示

    • 1 个回答
  • Marko Smith

    这些条目是什么意思,它们的完整等效项是什么样的

    • 2 个回答
  • Marko Smith

    浏览器仍然缓存文件数据

    • 1 个回答
  • Marko Smith

    在 Excel VBA 中激活工作表的问题

    • 3 个回答
  • Marko Smith

    为什么内置类型中包含复数而小数不包含?

    • 2 个回答
  • Marko Smith

    获得唯一途径

    • 3 个回答
  • Marko Smith

    告诉我一个像幻灯片一样创建滚动的库

    • 1 个回答
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Алексей Шиманский 如何以及通过什么方式来查找 Javascript 代码中的错误? 2020-08-03 00:21:37 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    user207618 Codegolf——组合选择算法的实现 2020-10-23 18:46:29 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5