24

阅读 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

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

4

2 回答 2

23

我认为这有两个目的:

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

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

于 2013-04-12T09:52:30.450 回答
9

我在 usenet 档案中找到了一些细节:http: //osdir.com/ml/lang.fsharp.general/2008-01/msg00009.html

F# 代码中的嵌入式 IL。官方是否支持此功能

并不真地。此功能 99.9% 的用途是用于 FSharp.Core.dll(在 1.9.2.9 及之前版本中称为 fslib.dll)中定义的操作。

从历史上看,允许最终用户嵌入 IL 以访问 F# 库或使用他们自己的嵌入式 IL 的语言结构无法访问的 .NET IL 功能一直很有用。现在 F# 库已经更加成熟,对此的需求变得越来越少,实际上几乎不存在。我们预计这种情况将继续存在。我们甚至有可能在 F# 的“产品”版本中将此作为库独有的功能,尽管我们尚未就此做出最终决定。

这是 Don Syme 于 2008 年 1 月发来的信息。

于 2013-04-13T18:02:45.137 回答