F#编译器的一个Bug

[<Struct>]

typeTestStruct =

val mutable _x:int

new(x) = {_x = x}

member this.Set(x) = this._x <- x

member this.X with get() = this._x;

let a = TestStruct(2)

let c() =

a.Set 10

a.X

c();;

这里编译器不报错,但是执行c()的结果是2. 如果把[<Struct>]去掉,执行结果是10,这就正确了。
结构里,Set 函数运行没有报错,但是实在上并没有改变到_x的值。

现在我们把后面的代码改动一下,把 a 声明为 mutable:

let mutable a = TestTruct(2)

let c() =

a.Set 10

a.X

c();;

最后执行结果是10(正确值)。也就是说,当结构内部含有可变值(mutable )时候,调用方如果也使用可变值(mutable ),可以得到正确结果。
但是调用方必须清楚结果内部的实现机制才行,这样就违反了结构的封装性。

因此得出结论:
 
F#中,结构里面的成员变量不能为可变值 mutable 。虽然编译可以通得过,但是可能让调用方得不到预期的结果。

F#编译器的一个Bug

时间: 2024-10-29 19:07:52

F#编译器的一个Bug的相关文章

[置顶]VC2013的一个bug

前段时间在尝试使用一个C++的GUI库nana.这个库最大的特点在于使用现代C++风格去编写GUI程序,而不需要使用大量的比较丑陋的代码(如MFC中的各种宏),或者其它的非C++元素.这是一个比较新的库,作者是个中国人,有兴趣的朋友可以去试一试,由于使用大量的C++11特性,所以需要VC2013或者GCC4.7以上的编译器.使用过程中无意间发现了VC2013的一个重载决议(overload resolution)上的一个bug,这边贴出来跟大家分享一下,或许可以帮助大家少走点弯路. 我写了以下简

VC2013的一个bug

前段时间在尝试使用一个C++的GUI库nana.这个库最大的特点在于使用现代C++风格去编写GUI程序,而不需要使用大量的比较丑陋的代码(如MFC中的各种宏),或者其它的非C++元素.这是一个比较新的库,作者是个中国人,有兴趣的朋友可以去试一试,由于使用大量的C++11特性,所以需要VC2013或者GCC4.7以上的编译器.使用过程中无意间发现了VC2013的一个重载决议(overload resolution)上的一个bug,这边贴出来跟大家分享一下,或许可以帮助大家少走点弯路. 我写了以下简

VS2010 编译器的数值计算bug

最近调试程序,发现一个奇怪问题,在测试样例时,有些样例有时出错,有时正确.仔细检查了程序,发现不是程序错误,最后只好对错误的情况,进行记录,然后调试,结果发现一个让人吃惊的问题,VS2010的编译器对于数值计算会犯一些数值分析所说的常见错误,例如我用command window调试发现了如下问题 >? f0 1020.0 >? f1 + f2- fjob 1024.0 >? f1 + f2 - fjob - f0 4.0 >? f1 + f2- f0 - fjob 0.0 值得指出

ollvm 编译器优化的bug

近来用ollvm来编译一些代码,主要是需要对so进行一些混淆的操作,发现了一个bug,记录如下: 代码段1 jint begin_antidebug() {     pthread_t antidebugtid;     int ret = 0;     ret = pthread_create(&antidebugtid, NULL, antidebug_listen_thread, NULL);     if(ret!=0)     {         LOGANTI("Create

由一个bug引出java包装类型

工作中遇到过一个bug,用两个POJO的 Integer 字段 做 == 判断,明明"数值"相等结果返回 false.检查代码,调试,看源码搞了好久,才知道是Java包装类理解不够惹的祸. 为了弄清楚其中的本质,先上一段代码: 1 int a = 5; 2 Integer b = 5; 3 Integer c = Integer.valueOf(5); 4 Integer d = Integer.valueOf(5); 5 Integer e = new Integer(5); 6 7

医生加号页改版,就一个Bug, 看医生工作台一期需求

8/8日报 分级埋点: [MobClick event:UmengPagePlusDoctor attributes:@{@"page":@"plusPage"}]; 弹层适配小屏幕, 标题比较长,太靠近左右两边了 使用中文标点符号 学习关于保险,超过50岁,重疾险就不好买了,这个"不好买”有两层意思,第一层,有的保险直接不卖给50岁以上的人,第二层,50岁以上的人重疾险非常昂贵,而且赔付的钱最多十万. 保险应该趁年轻买 看知乎,李元霸推荐的两款重疾险,父

F# 两个新Bug,集中在 module 中

新年发布F#的两个 Bug,都集中在 module 中. 第一个是:[<CLIEvent>] 特性在 module 中不起作用,CLIEvent 的作用是使 F# 的事件编译后生成标准接口,方便C#调用.但是 CLIEvent 在 module 中不运作,要实现相同的效果,只能通过 type 声明类,然后在类中声明静态事件. 第二个是:module 中声明的私有成员,在 module 外仍然可以赋值.实例代码如下: module K1Dialog = let mutable private F

VS、GNU STL存在一个Bug,而STLport-5.2.1则是没有的。

最后来到比较坑的代码中: SGI: istream_iterator(istream_type& _Istr) : _Myistr(&_Istr) { // construct with input stream _Getval(); } SGI PORT: istream_iterator(istream_type& _Istr) : _Myistr(&_Istr) { // construct with input stream _Getval(); } istream

Ibatis2.3.4的一个bug

java.lang.ClassCastException: com.chat.upgrade.domain.ClientFile cannot be cast to java.lang.String 今天查一个对象转化成json串报错的问题,查了两个小时,最后问题的根源居然是ibatis. ibatis的语句如下: <typeAlias alias="Client" type="com.chat.upgrade.domain.ClientFile"/>