[英]How to map Java overloaded constructors to Frege functions
Java(不幸的是)支持构造函数和方法重载。 例如, HashMap具有四个构造函数。 在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”。 Frege数据类型中可以有四个“ Java构造函数”吗?
可以使用|
定义重载的构造函数和方法|
:
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。 因此,如果您知道该方法可能返回null
,则可以采用生成的代码并修改纯度或将返回类型Maybe a
。
为了完整起见,您还可以编写:
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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.