内联时扩展方法出错

2023-12-14

我想扩展一些系统类型,然后通过内联使用它们

type System.String with  
    member this.foo n = this + "!" + n 

type System.Boolean with  
    member this.foo n = sprintf "%A!%A" this n 

现在我称这些扩展方法为

let x = "foo".foo "bar"
let y = true.foo "bar"

这给了我这个

- val x : System.String = "foobar"
- val y : string = "true!"bar""

一切都很好 - 但现在我想结束通话.foo进入内联函数

let inline foo n v = (^T : (member foo : ^N  -> ^S) v, n)
let z = foo "bar" "baz" 

只是现在我收到一个编译器错误告诉我

> The type 'string' does not support the operator 'foo':

嗯……确实如此!

有人可以解释一下发生了什么事吗?


静态成员约束中不考虑扩展方法(可能重复this),当您想要使用成员约束实现泛型代码并使其也适用于已定义的或原始类型时,这是一个普遍问题。

See the 用户声音请求,还有提到的解决方法here and Don Syme 解释了为什么在 F# 编译器中实现它很复杂.

如果您点击那里的链接,您将看到目前的解决方法,它基本上涉及为所有已知类型创建中间类型和重载,以及为扩展创建通用类型。

这是如何解决该问题的一个非常基本的示例:

type Foo = Foo with
    static member ($) (Foo, this:int)    = fun (n:int) -> this + n 
    static member ($) (Foo, this:string) = fun n -> this + "!" + n 
    static member ($) (Foo, this:bool)   = fun n -> sprintf "%A!%A" this n 

let inline foo this n = (Foo $ this) n

//Now you can create your own types with its implementation of ($) Foo.

type MyType() =
    static member ($) (Foo, this) = 
        fun n -> printfn "You called foo on MyType with n = %A" n; MyType()

let x = foo "hello" "world"
let y = foo true "world"
let z = foo (MyType()) "world"

您可以通过为新类型添加显式泛型重载来增强它:

// define the extensions

type System.String with  
    member this.foo n = this + "!" + n 

type System.Boolean with  
    member this.foo n = sprintf "%A!%A" this n 

// Once finished with the extensions put them in a class
// where the first overload should be the generic version.
type Foo = Foo with
    static member inline ($) (Foo, this) = fun n -> (^T : (member foo : ^N -> ^S) this, n)
    static member ($) (Foo, this:string) = fun n -> this.foo n 
    static member ($) (Foo, this:bool)   = fun n -> this.foo n
    // Add other overloads
    static member ($) (Foo, this:int)    = fun n -> this + n 

let inline foo this n = (Foo $ this) n

//later you can define any type with foo
type MyType() =
    member this.foo n = printfn "You called foo on MyType with n = %A" n; MyType()

// and everything will work
let x = foo "hello" "world"
let y = foo true "world"
let z = foo (MyType()) "world"

您可以通过手动编写静态约束并使用成员而不是运算符来进一步完善它(请参阅示例here),

最终你会得到这样的结果通用附加来自 FsControl 的函数。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

内联时扩展方法出错 的相关文章

  • “不等于”的 F# 语法是什么?

    在 C 代码中 它会是这样的 if c 0 some code 那么在 F 中呢 From MSDN 有关 F 算术运算符的页面 http msdn microsoft com en us library dd469493 aspx 看起来
  • F# 命名约定

    F 是否有 官方 命名 大小写约定 我总是怀疑是否使用 C 风格 Class MyFunctionName or Module my function name 在 F 中 您应该混合 BCL 类和 F 库类 它们具有不同的大小写 并且代码
  • 使用 leftOuterJoin,不需要 .DefaultIfEmpty()

    的文档leftOuterJoin MSDN 上的查询表达式 http msdn microsoft com en us library hh225374 aspx通过样本反复暗示 当使用leftOuterJoin on into 你仍然必须
  • 将事件绑定到 ItemsControl 中的按钮

    我有一个 Windows Phone 7 应用程序 其中包含一些 xaml 如下所示
  • 如何编写一个计算表达式生成器来累积值并允许标准语言构造?

    我有一个计算表达式生成器 可以随时生成值 并且有许多自定义操作 但是 它不允许标准 F 语言构造 并且我在弄清楚如何添加此支持方面遇到了很多麻烦 举一个独立的例子 下面是一个非常简单且毫无意义的构建 F 列表的计算表达式 type Item
  • 像 Javascript 对象一样循环遍历 F# 记录

    在 javascript 中 我可以使用简单的 for 循环访问对象的每个属性 如下所示 var myObj x 1 y 2 var i sum 0 for i in myObj sum sum myObj i 我想知道我是否可以用 F 做
  • F# 中的选项类型如何工作

    因此 我一直在阅读 Apress 的 Expert F 书籍 主要将其用作构建玩具式 F 库时的参考 但有一点我未能掌握 那就是 Option 类型 它是如何工作的以及它在现实世界中的用途是什么 选项类型至少为similar to Null
  • 如何从 C# 可移植类库 (PCL) 添加对 F# 可移植库的引用

    我有一个项目 其中包含两个 F 项目和一个 C 项目 我想在其中编写一些 XUnit 测试 FS PL F 3 1 3 3 1 0 可移植库 FS PL Legacy F 31 2 3 5 1 可移植库 旧版 测试 C NET 4 5 Wi
  • obj[] 和 string[] 作为参数

    我在用Microsoft FSharp Reflection FSharpValue MakeUnion这需要一个Reflection UnionCaseInfo and an obj 可以为空 作为参数 但是 我得到了Type misma
  • 基于函数签名的模式匹配

    在 F 中 您可以对函数签名进行模式匹配 我想用一个函数来装饰多个函数 该函数测量函数的执行情况并调用 statsd 我当前的功能是 let WrapFunctionWithPrefix metrics Metric Client IRec
  • 从函数返回随机值是副作用吗?

    我当时正在编写一些 F 代码 并且正在编写一个从一组字符串中返回随机字符串的函数 假设我有这样的事情 open System let a a b c d let rstring arr string let r new Random arr
  • 使用 FParsec 解析 int 或 float

    我正在尝试使用 FParsec 解析文件 该文件由 float 或 int 值组成 我面临两个问题 无法找到好的解决方案 1 Both pint32 and pfloat将成功解析相同的字符串 但给出不同的答案 例如pint32将返回3解析
  • Async.AwaitTask 在 f# 中如何工作?

    我知道 f 和 c 异步模型之间的主要区别在于 在 f 中 除非您调用 Async RunSynchronously 之类的内容 否则异步执行不会开始 在 C 中 当方法返回任务时 通常 并非总是 立即在后台线程中开始执行 Async Aw
  • 图像分析-光纤识别

    我是图像分析新手 您知道如何以仅获取纤维的方式对该图像进行二值化吗 我尝试过不同的阈值技术等 但没有成功 我不介意应该使用什么工具 但我更喜欢 NET or Matlab PS 我不知道该把答案放在哪里 所以我把它放在StackOverfl
  • F#:如何将 Json.NET [JsonConstructor] 属性应用于主构造函数?

    我正在尝试用 F 做一些事情 比如JsonConstructorAttribute中的示例Json NET 文档 http www newtonsoft com json help html JsonConstructorAttribute
  • 生成尾调用操作码

    出于好奇 我尝试使用 C 生成尾部调用操作码 斐波那契数很简单 所以我的 C 示例如下所示 private static void Main string args Console WriteLine Fib int MaxValue 0
  • 是否可以使用 fparsec 解析“越位”(基于缩进)语言?

    我希望将 FParsec 用于基于缩进的类似 python 的语言 我知道这必须在词法分析阶段完成 但 FParsec 没有词法分析阶段 是否可以使用 FParsec 或者 词法分析后如何提供它 P D 我是 F 新手 但在其他语言方面经验
  • .Net 中可用的并行技术

    我是 Net 平台的新手 我查了一下 发现 Net中有几种做并行计算的方法 任务并行库中的并行任务 即 Net 3 5 PLINQ Net 4 0 异步编程 Net 2 0 异步主要用于执行 I O 繁重的任务 F 有简洁的语法支持这一点
  • 使用部分函数短路列表映射

    因此 我创建了一个名为 tryMap 的函数 如下所示 tryMap with failure and success continuations let rec tryMapC R gt U list gt R gt T gt U opt
  • F# - 构造嵌套类型

    我想这是非常基本的 F 问题 类型有 type Id1 Id1 of int type Id2 Id2 of string type Id Id1 Id2 type Child Id Id Smth string list type Nod

随机推荐

  • 健康损失的迷宫中的最短路径

    假设您有一个由 2D 矩阵表示的地下城 您有一个起点 S x1 y1 和一个终点 E x2 y2 在此过程中 一些细胞中会有一个数字 这些数字会从您的健康得分中减去 其他细胞是你无法跨越的障碍 你一开始有 5 点生命值 你需要找到从 S 到
  • 处理带有空格的名称

    我的 Puppet 代理是 Windows Server 2012 我正在尝试向 AD 用户授予数据库权限 如果我尝试将权限分配给名称中不包含任何空格的 AD 用户 则该脚本可以正常工作 早些时候 不带空格的用户名也不起作用 但是当我添加额
  • 如何将highcharts中的毫秒级json数据格式化为日期格式?

    我从json获取日期数组为1420185600000 1420531200000 1420617600000 1420704000000 1420790400000 1420876800000 如何格式化它以在高图表的 X 轴标签中显示正确
  • 无法在android的服务中启动计时器

    我不知道发生了什么问题 我无法在我的服务中启动计时器 遵循代码 public class BkgService extends Service private Timer ServUpdTimer new Timer private sta
  • 使用 eclipse 插件将修改后的 AST 保存在新文件中

    我有一个 Eclipse 插件代码来操作项目 工作空间中的类 smcho Hello 我可以创建一个 CompilationUnit 并对其进行一些修改 但我需要将结果保存在不同的文件中以检查两个版本之间的差异 这是我获取 Compilat
  • 表格布局固定渲染如何?

    表格布局固定渲染如何 根据 17 5 2 1 固定表格布局 来自 W3 在固定表格布局算法中 每列的宽度确定如下 1 width 属性的值不是 auto 的列元素设置该列的宽度 2 否则 第一行中 width 属性的值不是 auto 的单元
  • Guava 前提条件 checkNull、checkArgument

    我想检查基类的先决条件 以便我知道子类型将始终使用有效的构造函数参数 让我们以一个构造函数为例 需要 2 个或更多参数 接受不同类型的参数 对于一个参数 它执行多次检查 例如 String 不为 nulland不是空的 在这种情况下 如何最
  • 文件签名验证

    我使用了 Mark Russinovich 编写的实用程序 它用于验证文件签名 任何人都知道如何做到这一点 我知道这不是一个简单的代码 但我只需要一些提示 API 步骤 指南图 只是为了朝着正确的方向前进 我读了太多关于 cryptAPI
  • Object.ReferenceEquals 从未命中

    谁能告诉我为什么以下条件不成立 List
  • Ruby 中方法名称末尾的问号是什么意思?

    Ruby 中问号运算符的用途是什么 有时会出现这样的情况 assert product valid 有时它在一个if构造 它是一种代码风格约定 它指示方法返回布尔值 true 或 false 或指示 true 值 或 truthy 值 的对
  • 错误膨胀类片段 |片段没有创建视图

    我遇到这个问题 android view InflateException 二进制 XML 文件行 31 膨胀类片段时出错 片段 com myapp mgm QueryFragment 未创建视图 此问题仅在平板电脑模式下发生 如果应用程序
  • 创建类对象时,抛出错误

    class A constructor this name A M1 return M1 class B extends A constructor this id B M2 return M2 var b new B output Ref
  • 具有 Passport-local 策略的 Composer-rest-server

    我无法找到一个有效的解决方案来在composer rest server 中使用本地策略进行身份验证 事实上 只有一种可行的解决方案是使用 github 我尝试将 COMPOSER PROVIDERS 设置为 export COMPOSER
  • Pandas read_html 导致 TypeError

    我正在使用 bs4 解析 html 页面并提取表格 下面给出示例表格 我试图将其加载到 pandas 中 但是当我调用pddataframe pd read html LOTable skiprows 2 flavor bs4 我收到下面列
  • SQL Server 全文搜索转义字符?

    我正在执行 MS SQL Server 全文搜索查询 我需要转义特殊字符 以便可以搜索包含特殊字符的特定术语 是否有内置函数可以转义全文搜索字符串 如果没有 你会怎么做 坏消息 没有办法 好消息 您不需要它 因为无论如何它都没有帮助 我在我
  • Android 无法实例化活动:在路径上找不到类

    我已经将项目导入到 Eclipse 中 当我尝试运行它时 会抛出以下异常 java lang RuntimeException Unable to instantiate activity ComponentInfo com polygra
  • WSO2 API 管理器 - 向公众公开发布者和商店 URL

    我在用着WSO2 API 管理器用于创建和管理开发者社区 据我所知 API 管理器是在 WSO2 Carbon Server 上驱动的 该服务器又在 Apache Tomcat 上运行 到目前为止 我可以毫无问题地运行 WSO2 API 管
  • 如何在我的应用程序中包含 64 位和 32 位本机代码

    我无法将我的应用程序上传到 Playstore 并出现此错误 我还构建了 Android App Bundle 来上传应用程序 但再次出现此错误 此版本不符合 Google Play 64 位要求 以下 APK 或 App Bundle 可
  • 爱普生TM-T88V格式化

    我设置了一台运行 Ubuntu Server 12 04 的小机器 并直接插入 Epson TM T88V 起初我能够很好地打印 使用 lp 但自动切纸器无法工作 我意识到它只是没有使用驱动程序中包含的正确 PPD 文件 因此一旦我将打印机
  • 内联时扩展方法出错

    我想扩展一些系统类型 然后通过内联使用它们 type System String with member this foo n this n type System Boolean with member this foo n sprint