2

Java(不幸的是)支持构造函数和方法重载。例如,HashMap有四个构造函数。在弗雷格我不能这样做:

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

这不会编译,因为我不能绑定四次“新”。Frege 数据类型中是否可以有四个“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 代码。上面的代码是使用该项目生成的。

我说起点是因为这不能完全自动化。我们无法确定方法的纯度和本地方法的空值。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 回答