在Frege中使用java.util.Properties

时间:2015-03-14 07:45:52

标签: java interop frege

我尝试使用frege.java.Util 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。我怎么能解决这种歧义?

1 个答案:

答案 0 :(得分:1)

嗯,这是能够使用Java中重载的方法的一些结果。虽然大多数情况下,当重载具有相同的arity时,这种方法没有任何问题,但在其他情况下,如果没有额外的类型注释,则无法正常工作。当没有关于变量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的子类型。