【问题标题】:Use java.util.Properties in Frege在 Frege 中使用 java.util.Properties
【发布时间】:2015-03-14 07:45:51
【问题描述】:

我正在尝试使用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。我该如何解决这种歧义?

【问题讨论】:

    标签: java interop frege


    【解决方案1】:

    嗯,这是能够使用 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 的子类型。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-05-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-15
      相关资源
      最近更新 更多