f# - 在 F# 标准库实现中看到的 (# ... #) 语法是什么?

标签 f# cil

阅读 Array2D 模块的源代码,我在许多核心功能的实现中偶然发现了这个有趣的结构,例如:

[<CompiledName("Get")>]
let get (array: 'T[,]) (n:int) (m:int) =  (# "ldelem.multi 2 !0" type ('T) array n m : 'T #)  

我只能假设这是内联 CIL 的语法,并且在这里使用显然是为了获得性能优势。但是,当我尝试在我的程序中使用此语法时,我收到一个错误:
warning FS0042: This construct is deprecated: it is only for use in the F# library

这究竟是什么?有详细的文档吗?

最佳答案

我认为这有两个目的:

  • 这些函数可以精确编译成 1 条 CIL 指令,该指令必须在某处进行编码,因此在源代码处进行编码似乎是最好的。
  • 它允许一些额外的技巧来定义多态Add以 F# 类型系统难以实现的高性能方式运行。

  • 您实际上可以使用它,但您必须指定 --compiling-fslib (未记录)和 --standalone代码中的标志。

    关于f# - 在 F# 标准库实现中看到的 (# ... #) 语法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15968054/

    相关文章:

    F#在不匹配的情况下提取可区分联合内的值

    c# - 如何从 F# 调用 Enumerable.Join?

    .net - MSIL 虚拟地址

    c# - F# Struct with Interface,C# 元数据不显示从 Interface 的继承

    .net - 预发布 Collections.Immutable

    c# - 是否有 C# 代码可以直接在对象引用上调用 `brtrue`/`brfalse` 指令的空检查功能?

    assembly - 字节码和汇编语言是一回事吗?

    .net - msil ".maxstack 1"推送超过 1 个值

    .net - 在 IL 代码中,为什么在给定情况下没有 nop 操作码?为什么在给定情况下有 br.s 操作码?

    .net - System.Console.WriteLine() 与 F# 中的 printfn