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


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

查看所有标签

猜你喜欢:

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

细节决定交互设计的成败

细节决定交互设计的成败

张亮 / 2009-3 / 49.00元

《细节决定交互设计的成败》是一本非常实用的有关软件界面的交互设计和可用性设计方面知识的书籍,通过采用一问一答的形式,你将会有针对性地学习到一些能够很快应用在自己软件开发工作中的细节知识和诀窍。例如,如何减轻用户的等待感,如何预防和减少用户的使用错误等。另外,你会发现阅读《细节决定交互设计的成败》时会非常轻松和愉悦;这是由于《细节决定交互设计的成败》写作上的两个特点:第一,采用较多日常生活中的例子来......一起来看看 《细节决定交互设计的成败》 这本书的介绍吧!

MD5 加密
MD5 加密

MD5 加密工具

正则表达式在线测试
正则表达式在线测试

正则表达式在线测试

HSV CMYK 转换工具
HSV CMYK 转换工具

HSV CMYK互换工具