F#接口由于单位继承故障

栏目: ASP.NET · 发布时间: 7年前

内容简介:这在F#语言中看起来像是一个讨厌的角色,但我不知道它是否符合编译器的设计限制或错误.如果是设计限制,则错误消息应该说(因为目前来说,这并不太有意义).无论如何,问题是F#编译器不会在IL中生成实际包含单元类型的代码.它用void(当用作返回类型)或空参数列表(用作方法或函数参数)时替换它).这意味着在MyClass类型中,编译器决定将MyFun成员编译成一个接受字符串并返回void(但不能使用void作为通用类型参数的方法)的方法,因此这不起作用).原则上,在这种情况下,编译器可以使用实际的单元类型(因为
有谁知道为什么这不能编译?
type MyInterface<'input, 'output> = 
    abstract member MyFun: 'input -> 'output

type MyClass() = 
    interface MyInterface<string, unit> with
        member this.MyFun(input: string) = ()
    //fails with error FS0017: The member 'MyFun : string -> unit' does not have the correct type to override the corresponding abstract method.
type MyUnit = MyUnit
type MyClass2() = 
    //success
    interface MyInterface<string, MyUnit> with
        member this.MyFun(input: string) = MyUnit

这在F#语言中看起来像是一个讨厌的角色,但我不知道它是否符合编译器的设计限制或错误.如果是设计限制,则错误消息应该说(因为目前来说,这并不太有意义).

无论如何,问题是F#编译器不会在IL中生成实际包含单元类型的代码.它用void(当用作返回类型)或空参数列表(用作方法或函数参数)时替换它).

这意味着在MyClass类型中,编译器决定将MyFun成员编译成一个接受字符串并返回void(但不能使用void作为通用类型参数的方法)的方法,因此这不起作用).原则上,在这种情况下,编译器可以使用实际的单元类型(因为这是唯一的方式来使其运行),但是这可能会在别的地方产生其他不一致.

创建MyUnit的诀窍是,我认为,解决问题是一个很好的方法.即使核心的F#库在实现的某些地方(在异步工作流程中)使用类似MyUnit的东西来处理单元的一些限制(以及它被编译的方式).

代码日志版权声明:

翻译自:http://stackoverflow.com/questions/4485445/f-interface-inheritance-failure-due-to-unit


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Go语言学习笔记

Go语言学习笔记

雨痕 / 电子工业出版社 / 2016-6 / 89

作为时下流行的一种系统编程语言,Go 简单易学,性能很好,且支持各类主流平台。已有大量项目采用 Go 编写,这其中就包括 Docker 等明星作品,其开发和执行效率早已被证明。本书经四年多逐步完善,内容覆盖了语言、运行时、性能优化、工具链等各层面知识。且内容经大量读者反馈和校对,没有明显的缺陷和错误。上卷细致解析了语言规范相关细节,便于读者深入理解语言相关功能的使用方法和注意事项。下卷则对运行时源......一起来看看 《Go语言学习笔记》 这本书的介绍吧!

JSON 在线解析
JSON 在线解析

在线 JSON 格式化工具

MD5 加密
MD5 加密

MD5 加密工具

HEX CMYK 转换工具
HEX CMYK 转换工具

HEX CMYK 互转工具