繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM