我正在尝试使用 module来构造一个Properties实例。下面是代码:
module frege_test.Application where
import frege.java.Util (Properties)
main :: [String] -> IO Int
main _ = do
properties <- Properties.new ()
return 0如果没有编译,下面是编译器错误:
E T:\Temp\frege-test\src\main\frege\Application.fr:7: overloaded new is ambiguos at type ()→IO t17332
It could mean one of
Properties.newα :: ∀ s.() → STMutable s Properties
Properties.newβ :: ∀ s.Mutable s Properties → STMutable s Properties
Util.Hashtable.newα :: ∀ s k v.() → STMutable s (Util.Hashtable k v)
Util.Hashtable.newβ :: ∀ s k v.Int → STMutable s (Util.Hashtable k v)
Util.Hashtable.newγ :: ∀ s k v.Int → Float → STMutable s (Util.Hashtable k v)
Util.Hashtable.newδ :: ∀ s k v.Mutable s (Util.Map k v) → STMutable s (Util.Hashtable k v)
frege_test.Application: build failed because of compilation errors.出什么事啦?我甚至还没有进口Util.Hashtable。我怎样才能解决这个模棱两可的问题?
发布于 2015-03-14 12:44:31
这是能够使用Java中重载的方法的结果。虽然这在大多数情况下没有任何问题,但在其他情况下,在没有额外类型注释的情况下,重载是不会正常工作的。当没有关于变量properties应该是什么的其他信息时,情况就会更糟,就像上面的情况一样。
最简单的快速修复方法是从错误消息中选择要使用的重载类型,然后写入
properties <- (Properties.new :: () → STMutable s Properties) ()但是,当您经常需要一个空的属性列表时,下面的情况会更好:
emptyProps :: ST s (Mutable s Properties)
emptyProps = Properties.new ()这是因为类型注释为编译器提供了足够的信息来选择正确的重载。你就这样用它:
main _ = do
p <- emptyProps
...
return 0关于Util.Hashtable:由于您导入了frege.java.Util,所以这里定义的所有数据类型和函数都是可用的,并且可以使用像Util.Hashtable这样的限定名来访问。
出于某种原因,编译器认为您可能需要这些。也许是因为它知道java.util.Properties是java.util.Hastable的一个子类型。
https://stackoverflow.com/questions/29046681
复制相似问题