内容简介:这在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
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
数学与泛型编程
[美]亚历山大 A. 斯捷潘诺夫(Alexander A. Stepanov)、[美]丹尼尔 E. 罗斯(Daniel E. Rose) / 爱飞翔 / 机械工业出版社 / 2017-8 / 79
这是一本内容丰富而又通俗易懂的书籍,由优秀的软件设计师 Alexander A. Stepanov 与其同事 Daniel E. Rose 所撰写。作者在书中解释泛型编程的原则及其所依据的抽象数学概念,以帮助你写出简洁而强大的代码。 只要你对编程相当熟悉,并且擅长逻辑思考,那么就可以顺利阅读本书。Stepanov 与 Rose 会清晰地讲解相关的抽象代数及数论知识。他们首先解释数学家想要解决......一起来看看 《数学与泛型编程》 这本书的介绍吧!