如何将Java重载构造函数映射到Frege函数

时间:2014-05-17 20:17:01

标签: java frege

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

这不能编译,因为我无法绑定四次“new”。是否有可能在Frege数据类型中有四个“Java构造函数”?

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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