读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
究竟这是什么道理? 是否有详细的文档?
我认为,这有2个目的:
- 这些功能向下编译到具有在某处被编码的正好1 CIL指令,所以在源编码似乎最好。
- 它允许具有多态定义一些额外的挂羊头卖狗肉
Add
在高性能的方式,这是很难与F#类型系统的功能。
实际上,你可以使用这个,但你必须指定--compiling-fslib
(无证)和--standalone
在你的代码标志。
我发现一些细节在新闻组档案: 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#中的“产品”版本只有库的功能,虽然我们还没有在这方面作出最后决定它甚至有可能。
这是从唐赛姆消息,日期为2008年1月。