簡體   English   中英

在Frege中使用java.util.Properties

[英]Use java.util.Properties in Frege

我正在嘗試使用frege.java.Util模塊構造一個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沒有導入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的子類型。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM