【问题标题】:What is the (# ... #) syntax seen in F# standard library implementation?在 F# 标准库实现中看到的 (# ... #) 语法是什么?
【发布时间】:2013-04-04 18:51:23
【问题描述】:

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

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

【问题讨论】:

  • 在我看来像一张困惑的脸
  • 我理解好奇心,但我会警告它仅用于 F# 库中,这表明我们任何人都不需要使用它:-)
  • 您可能希望发布您找到的答案作为答案,而不是将其编辑到问题中。
  • 酷,我已经编辑了问题并将该部分移到了答案中。
  • @OnorioCatenacci 我想忽略它,但简单的现实是 F# IntelliSense 说我的一些 let 表达式有这种类型。我写的时候似乎发生了:let (a, b, c) = ...

标签: f# cil


【解决方案1】:

我在 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# 库无法访问的 .NET IL 功能或 使用自己的嵌入式 IL 的语言结构。对此的需求是 变得更加罕见,实际上几乎不存在,现在 F# 图书馆已经成熟了一点。我们预计这将继续成为 案子。我们甚至有可能将其设为仅限库的功能 在 F# 的“产品”版本中,虽然我们还没有做出最终版本 这方面的决定。

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

【讨论】:

  • 这个答案没有解释为什么一些 VS2019 IntelliSense 推断的类型签名有(#a -&gt; unit) * float * SomeType list) - 如果我遗漏了我应该从答案中推断出来的东西,我们深表歉意。
  • 我想我明白了 - #a 是一个灵活类型 - 接受 a 的任何子类型。
【解决方案2】:

我认为这有两个目的:

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

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

【讨论】:

  • 太棒了!您在哪里找到有关这些编译器选项的信息?
  • @e-i-s - 有一个源文件将它们全部放在某个地方 - 虽然不太确定在哪里 - 搜索 standalone 的源可能会有所帮助
  • 这个答案没有解释为什么一些 VS2019 IntelliSense 推断的类型签名有(#a -&gt; unit) * float * SomeType list) - 如果我遗漏了我应该从答案中推断出来的东西,我深表歉意。
  • 我想我明白了 - #a 是一个灵活类型 - 接受 a 的任何子类型。
猜你喜欢
  • 2021-08-26
  • 1970-01-01
  • 2023-04-06
  • 2021-06-29
  • 2019-12-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-03
相关资源
最近更新 更多