gpt4 book ai didi

java - 在 Frege 中使用 java.util.Properties

转载 作者:太空宇宙 更新时间:2023-11-04 06:08:21 25 4
gpt4 key购买 nike

我正在尝试使用 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 中重载方法的一些结果。虽然当重载具有相同数量时,这在大多数情况下都可以正常工作,但在其他情况下,如果没有额外的类型注释,它并不总是有效。当没有关于变量 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 的子类型。

关于java - 在 Frege 中使用 java.util.Properties,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29046681/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com