2

Java は (残念ながら) コンストラクターとメソッドのオーバーロードをサポートしています。たとえば、HashMapには 4 つのコンストラクターがあります。Frege ではできません:

data Map = native java.util.Map

data HashMap = native java.util.HashMap where
    native new :: () -> STMutable s HashMap
    native new :: Int -> STMutable s HashMap
    native new :: Int -> Float -> STMutable s HashMap
    native new :: Mutable s Map -> STMutable s HashMap

「new」を4回バインドできないため、これはコンパイルされません。Frege データ型に 4 つの「Java コンストラクター」を含めることは可能ですか?

4

2 に答える 2

4

オーバーロードされたコンストラクターとメソッドは、次を使用して定義できます|

data HashMap k v = native java.util.HashMap where

  native new :: Mutable s (Map k v) -> STMutable s (HashMap k v)
              | () -> STMutable s (HashMap k v)
              | Int -> STMutable s (HashMap k v)
              | Int -> Float -> STMutable s (HashMap k v)

このhttps://github.com/Frege/native-genを出発点として使用して、Java クラスから Frege コードを生成することもできます。上記のコードは、そのプロジェクトを使用して生成されます。

これは完全に自動化できないため、出発点と言いました。メソッドの純粋性とネイティブ メソッドからの null を判断することはできません。したがって、生成されたコードを取得して純度を変更したりMaybe a、メソッドがnull.

于 2014-05-18T02:05:15.873 に答える
2

完全を期すために、次のように書くこともできます。

data HashMap = native java.util.HashMap where
    native new       :: () -> STMutable s HashMap
    native new1  new :: Int -> STMutable s HashMap
    native new2  new :: Int -> Float -> STMutable s HashMap
    native new3  new :: Mutable s Map -> STMutable s HashMap

つまり、一般的な形式では、Frege で使用する名前を指定してから、java の名前を指定します。

これはまた、Javaコードでアクセスしたいアイテムが、Fregeのキーワードである名前を持っている場合に不可欠ですdata。例えば:

    native datum "data" :: Int
于 2014-05-18T11:42:22.713 に答える