将内联与显式成员约束相结合时出现奇怪的错误

2023-12-23

(更新:我添加了一个重现示例)

代码如下所示:

type Lib =
    static member inline tryMe (a: ^a) = 
        let name = (^a: (static member name: string) ())
        name

type Test =
    struct 
        val Value: string
        new v = {Value = v}
    end
    static member inline name with get() = "HiThere"
    static member works(a:Test) = Lib.tryMe a

这将“正常工作”并编译。但是,如果你稍微扩展一下,例如如下所示:

/// Does a bounds check and raises an error if bounds check is not met
let inline checkBounds f (g: 'b -> ^c) (tp: ^a) = 
    let convertFrom = (^a: (static member name: string) ())
    let convertTo = (^c: (static member name : string) ())
    let value =  (^a: (member Value: 'b) tp)
    if f value then
        g value
    else 
        failwithf "Cannot convert from %s to %s." convertFrom convertTo


type ConverterA =
    struct 
        val Value: sbyte
        new v = { Value = v }
    end

    static member inline name with get() = "converter-a"
    static member inline convert (x: ConverterA) : ConverterB = 
        checkBounds ((>=) 0y) (byte >> ConverterB) x

and ConverterB =
    struct 
        val Value: byte
        new v = { Value = v }
    end
    static member inline name with get() = "converter-b"

它会引发一大堆虚假的 FSharp 编译器错误。

错误 FS1114:值“Foo.Bar.name”已标记 内联但未绑定在优化环境中

错误 FS1113:值“名称”被标记为内联,但其 实现使用内部或私有函数,该函数不是 足够容易到达

警告 FS1116:标记为“内联”的值具有意外值

错误 FS1118:无法内联值“名称” 标记为“内联”,可能是因为递归值被标记为“内联”

我还没有看到其他内联函数发生这种情况。我不确定这里会发生什么。如果我稍微改变一下,例如删除convertToline 及其依赖项,它编译得很好。

在 FSI 中运行代码时,即使使用 FSI 设置,也不会出现错误--optimize.

我可以通过删除来解决这个问题inline。对于这种类型的字段来说,这并不重要,JIT 会内联它们,即使 F# 没有。

这是编译器错误吗?或者我的代码中是否存在错误,或者我没有意识到对显式成员约束的某些限制?


您需要重新排序,以便您使用的函数在使用时就已知,否则 F# 编译器似乎不知道要内联什么。正如您在下面的评论中所说,如果您问我,这个答案就是一个错误。

/// Does a bounds check and raises an error if bounds check is not met
let inline checkBounds f (g: 'b -> ^c) (tp: ^a) = 
    let convertFrom = (^a: (static member name: string) ())
    let convertTo = (^c: (static member name : string) ())
    let value =  (^a: (member Value: 'b) tp)
    if f value then
        g value
    else 
        failwithf "Cannot convert from %s to %s." convertFrom convertTo

type ConverterB =
    struct 
        val Value: byte
        new v = { Value = v }
    end
    static member inline name with get() = "converter-b"

and ConverterA =
    struct 
        val Value: sbyte
        new v = { Value = v }
    end

    static member inline name with get() = "converter-a"
    static member inline convert (x: ConverterA) : ConverterB = 
        checkBounds ((>=) 0y) (byte >> ConverterB) x
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将内联与显式成员约束相结合时出现奇怪的错误 的相关文章

  • 如何使用 printf 自定义自定义类型的输出?

    我已经阅读了很多内容专家 F 并正在致力于构建一个实际的应用程序 在调试时 我已经习惯了传递这样的 fsi 命令 以使 repl 窗口中的内容清晰可见 fsi AddPrinter fun x myType gt myType ToStri
  • 如何在 x 轴上显示每个元素的标签?

    我有包含文件名和编号的元组序列 我想绘制柱形图 其中 X 轴上有文件名 我的问题是现在 X 轴下仅显示 3 个标签 文件名 这可能是因为屏幕无法容纳更多内容 还是X轴间隔错误 如何让图表显示所有文件名 也许有办法将这些标签逆时针旋转 90
  • 双前向/后向管道操作符是否有记录?

    我记得读过有关双管道运算符的内容 gt 和 Example let print a b sprintf O O a b 1 2 gt print val it string 1 2 双 向前 向后 管道运算符记录在以下列表中MSDN 上的
  • 对 null/空值使用 bool.Parse 时出错

    我有一个使用管道运算符的表达式 该表达式将值转换为字符串 然后转换为布尔值 但有时原始值可能为空 当值为 null 时 如何使用模式匹配或其他方式假设 false type kv Dictionary
  • 无法安装 Visual Studio C++ 包含文件“excpt.h”

    我正在尝试编译一个 Visual Studio C 项目 但由于编译器报告 无法打开包含文件 excpt h 没有这样的文件或目录 我无法到达任何地方 该问题已在互联网上多次报告 但我找不到有关我的具体情况的任何帮助 问题不在于项目的包含路
  • 无法对非静态方法进行静态引用

    使用 Java 构建多语言应用程序 插入字符串值时出现错误R string资源 XML 文件 public static final String TTT String getText R string TTT 这是错误消息 错误 无法从类
  • 文件是为不受支持的文件格式构建的?

    我在 OS X 上 当我尝试在终端中执行此命令时出现编译错误 g Wall o test E test E cppdynamic array cpp oracle o 我的其他 C 文件 例如test A cpp and test B cp
  • (定义一个宏)方便OpenGL命令调试?

    有时插入条件打印和检查需要很长时间glGetError 使用二分搜索的形式来缩小范围 其中第一个函数调用是 OpenGL 首先报告错误 我认为如果有一种方法可以构建一个宏 我可以包装所有可能失败的 GL 调用 并有条件地调用 那就太酷了gl
  • 如何更改 Rx Builder 实现来修复堆栈溢出异常?

    我正在尝试提出一个 Rx Builder 以在 F 计算表达式语法中使用反应式扩展 我该如何修复它 以免堆栈崩溃 就像下面的 Seq 例子一样 是否有计划提供 RxBuilder 的实现作为响应式扩展的一部分或作为 NET Framewor
  • Async.TryCancelled 不适用于 Async.RunSynchronously

    我尝试创建一个根据用户交互更新 UI 的代理 如果用户单击按钮 则应刷新 GUI 模型的准备需要很长时间 因此希望如果用户单击其他按钮 则取消准备并开始新的准备 到目前为止我所拥有的 open System Threading type p
  • 错误 - 仅返回类型不同的函数不能重载。由 小码哥发布于

    我正在尝试创建一个图书馆管理系统 我收到一些我不明白的错误 我在 Mac 操作系统中使用 Eclipse 我的主要代码是 include
  • 如何在 F# 中将对象转换为泛型类型列表

    在下面的代码片段中 我的目的是将 System Object 可能是 FSharpList 转换为它所持有的任何泛型类型的列表 match o with list lt gt gt addChildList o gt list lt gt
  • `ImmutableSortedSet` 和 fsharp `Set` 有什么区别?

    BCL引入了一组Immutable Collections http blogs msdn com b bclteam archive 2012 12 18 preview of immutable collections released
  • 如何在Qt中设置编译器?

    我对 Qt 完全陌生 我下载了离线版本 Qt 5 3 2 for Windows 64 bit VS 2013 OpenGL 573 MB 我无法编译我的项目 I have Qt Creator 3 2 1 开源 基于Qt 5 3 2 MS
  • 什么是错误“类型实例化涉及 byref 类型。” F# 中的解决方法是什么

    我有一些代码包装 TA Lib 很多包装器非常相似 let sma timePeriod int data float let mutable outStartIndex 0 let mutable outNbElement 0 let m
  • F# 编码练习

    我一直在 Visual Studio 2010 中涉足 F 我是一名在 C 和 Java 等面向对象语言方面拥有更多代码 架构设计经验的开发人员 为了扩展我的技能并帮助做出更好的决策 我正在尝试使用不同的语言来做不同的事情 特别是掌握使用函
  • 动态框架中未定义的架构符号

    我正在开发一个 iOS 框架 该框架包含多个第三方框架并使用 UnitySendMessage C 方法与 Unity 进行通信 我想创建一个动态框架 支持 iOS8 但我偶然发现以下编译错误 Undefined symbols for a
  • 使用 SqlBulkCopy 和 F# 在 SQL 中导出矩阵

    我想将大量数据从 F 传输到 SQL 表 基本上我的 F 代码创建了一个三列矩阵 UserID ProductID and price 和N行 我想将其 复制 粘贴 到数据库中 我尝试了多种选择 但最终 从 F 传输数据非常慢 10000
  • 将属性应用于返回值 - 在 F# 中

    在 C 中 可以将属性应用于方法的返回 return DynamicAttribute public object Xyz return new ExpandoObject 这在 F 中可能吗 背景 我想要一个用 F 编写的库的方法 该方法
  • 如何在 TypeScript 中禁用/抑制库中的错误?

    我打开了一些编译器开关来报告代码中的更多问题 例如严格的空检查 但我在使用的库中遇到了数十个错误 例如 default xxx node modules angular core src util decorators d ts 11 5

随机推荐

  • jshell 启动时加载脚本的不同方法

    根据文档 还有在启动时加载脚本的选项 包括一些特殊的预定义选项 这些是使用 startup 标志指定的 传入文件名或以下之一 DEFAULT 加载默认行为 这与根本没有指定的行为相同 JAVASE 默认导入所有 Java SE 包 PRIN
  • FormBuilder 控件导致“表达式在检查后已更改”异常

    我有一个正在通过编程方式实例化的表单DynamicComponentLoader loadIntoLocation 表单代码如下 constructor private builder FormBuilder this editForm b
  • 如何使用log4j2(xml中的MDC)将不同的日志写入不同的文件中?

    现在我使用这样的结构 附加器
  • iOS:多个启动图像

    是否可以提供多个启动图像 而不是仅提供一个 Default png 启动图像 我的目标是 例如 您有 5 个不同的启动图像 并且对于每个应用程序启动 它都会显示另一个启动图像 以防万一有人对此做出回应 我知道对于不同的配置 例如屏幕方向 可
  • 如何在两个视图之间生成离线差异输出?

    我正在分析 Clearcase 中两个视图之间的不同文件 我需要生成输出 以便我可以在没有互联网连接的情况下完成此任务 我想要的是运行一个命令 递归地遍历每个视图 并为从视图 A 到视图 B 的每次更改生成一个合并 差异输出文件 这可以像合
  • 关于使用指针修改 const 变量的混乱

    以下示例使我的理解更加混乱 我无法理解如何修改本地 const 变量 请帮助我理解同样的事情 Compile code without optimization option volatile c include
  • 将带有通配符的参数传递给 Python 脚本

    我想做这样的事情 c data gt python myscript py csv 并将目录中的所有 csv 文件传递 给我的 python 脚本 这样sys argv包含 file1 csv file2 csv etc But sys a
  • 在 body 之前发送 head 以尽快加载 CSS 和 JS

    我想知道是否有人找到了一种在渲染中间发送 head 标签的方法 以便在页面渲染完成之前加载 CSS 和 Javascript 我们的页面大约需要 523 毫秒来呈现 并且在收到页面之前不会加载资源 我已经完成了很多 PHP 工作 并且可以在
  • 在 NTFS 上打开许多小文件太慢

    我正在编写一个程序 应该处理许多小文件 比如说数千甚至数百万 我一直在 500k 文件上测试该部分 第一步只是迭代一个目录 其中包含大约 45k 目录 包括子目录的子目录等 和 500k 小文件 遍历所有目录和文件 包括获取文件大小和计算总
  • 在 C# 中创建自定义引导程序/引导加载程序

    我们决定为我们的部署解决方案创建一个自定义引导程序 我们目前正在重写和重新设计我们所有产品的部署策略 遗憾的是 我们都不是部署专家 这是到目前为止我们所得到的 答 MSI 包将在 InstallShield 中编写 我们将使用 Instal
  • JNI_OnLoad 返回错误版本 (-1)

    我试图在我的 Android 应用程序中加载 Qt5Core 库 我得到了这个 JNI OnLoad returned bad version 1 in data data com xxx yyy lib libQt5Core so 0x4
  • WPF 中的 NumericUpDown 等效项很好吗? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在 WPF 中寻找一个简单的 NumericUpDown 又名数字微调器 控件 这似乎是WPF中另
  • CSR scipy 矩阵在更新其值后不会更新

    我在 python 中有以下代码 import numpy as np from scipy sparse import csr matrix M csr matrix np ones 2 2 dtype np int32 print M
  • Python 读取文件超时

    在Linux中 有一个文件 sys kernel debug tracing trace pipe 顾名思义 是一个管道 因此 假设我想使用 Python 读取其中的前 50 个字节 我运行以下代码 sudo python c f open
  • Keycloak:从内部 docker 容器运行时令牌颁发者无效

    我在配置 keycloak 在我们的服务器上运行时遇到一些问题 在本地它工作得很好 但在我们的测试环境中 登录后 在使用收到的访问令牌的任何调用中 我们得到 无效的令牌颁发者 预期 http keycloak 8080 auth realm
  • makefile 中的 $(eval ) 导致配方在第一个目标错误之前开始

    CFormat define Format File echo Formatting ifneq wildcard 1 echo if1 The default extensions for intermediate files are n
  • import 语句中的解构赋值

    根据这个source https ponyfoo com articles es6 destructuring in depth以及在某个项目中看到过这种用法的模糊记忆 我很好奇是否有人能够执行以下操作 import map series
  • 如何阻止 WordPress 中的可视化编辑器更改代码?

    每次我切换到 WordPress 中的可视化编辑器时 它都会更改我的代码 例如删除 br 我该如何阻止这个 您不能在基础框架中不添加一些插件 但是 如果您想在可视化编辑器端进行简单的中断 请使用 Shift Enter
  • 如何使用 IE10 播放 HTML5 视频

    我希望有人知道如何帮助我在本地 Intranet 上播放 HTML5 视频 我的 Web 服务器 Windows Server 2008 R2 标准 64 位 IIS版本 IIS7 测试用户环境 Windows 7 Enterprise 使
  • 将内联与显式成员约束相结合时出现奇怪的错误

    更新 我添加了一个重现示例 代码如下所示 type Lib static member inline tryMe a a let name a static member name string name type Test struct