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构造函数”?
答案 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