这个警告意味着什么?我们有什么方法可以避免这种警告吗?我试图理解编译器代码here中的消息,但我无法理解。
frege> native sysin "java.lang.System.in" :: InputStream
native function sysin :: InputStream
3: note that the java expression
java.lang.System.in is supposed to be
constant.
我也尝试了下面的代码,但得到了相同的警告:
frege> native sysin "java.lang.System.in" :: MutableIO InputStream
native function sysin :: MutableIO InputStream
3: note that the java expression
java.lang.System.in is supposed to be
constant.
答案 0 :(得分:2)
这只是一个提醒,java值可能会在程序的生命周期内发生变化,但是程序员通过使用这种表示法来假设其事实上的不变性。
实际上,可以在Java级别重新分配这些字段。在这种情况下,Frege代码仍然可以返回它可能在某处缓存的先前值。或者它可能违反引用透明度,因此sysin
在任何地方都不一样。
如果您需要确保获得可变字段的当前值,则需要将其声明为IO或ST。
当我们知道某个值不会改变时,这个特性被认为是一种解脱,因此我们可以写下:
dosomething sysin
而不是
sysin >>= dosomething
例如,在[{1}}中使用了这一点,其中frege.java.IO
,stdin
和stdout
就是这样定义的。
除非使用nowarn进行编译,否则无法抑制警告。除非你绝对确定你正在做正确的事情,即当正确的IO或ST动作始终产生相同的值时,否则不应该使用此功能。