【问题标题】:Converting a Frege List to a Java Array将 Frege 列表转换为 Java 数组
【发布时间】:2016-05-21 21:43:38
【问题描述】:

假设我在 Frege 中定义了一个小的、有些冗余的桥接函数

listToArray :: (PrimitiveArrayElement α) => [α] -> JArray α
listToArray = arrayFromList

以及一些将已经获得的TList<Long> 传递给它的 Java 代码

TList<Long> tl_results = ...
Long[] results = FregeStuffies.listToArray(IPrimitiveArrayElement_Long.it, Thunk.lazy(results));

Eclipse 抱怨传递给FregeStuffies.listToArray 的参数不适用于它的实际情况

listToArray(PreludeArrays.CPrimitiveArrayElement<α[],α>, Lazy<PreludeBase.TList<α>>)

我是否传入了错误的 {context}/{instance of PrimitiveArrayElement}?

【问题讨论】:

  • 这是否与java有关?
  • Frege 是“用于 JVM 的 Haskell”。在这里,Frege 将 Frege 列表传递给 Java,Java 将其传递回 Frege 以转换为 Java 数组,给定一些上下文。
  • @YassinHajaj 与 Java 密切相关,是的。看我的回答。

标签: java arrays list interop frege


【解决方案1】:

原始数组类型需要在 Java 中进行一些特殊处理,这也限制了在 Frege 中的完全泛型使用。

这样做的原因是我们在 Java 中还不能将原始类型作为泛型。当我们有

 static<A> ... foo(A[] arg) { ... }

在 Java 中,我们不能用 intlong 这样的原始类型来实例化类型变量 A

这意味着,就目前而言,您的 listToArray 函数不适用于基于 Java 原始类型的 Frege 类型(据说 Java 10 将支持此类事情)。

对于原始类型的数组,您需要知道它是哪种类型,然后根据您的情况调用适当的方法:

PreludeArrays.IPrimitiveArrayElement_Long.arrayFromList

另请注意,装箱的原始类型目前没有被 Frege 明确支持。这是因为这些类型是通过 Java 自动装箱和自动拆箱来支持的。

如果你真的需要一个装箱long的数组,你可以将java.lang.Long定义为本机类型,使其成为ArrayElement的实例,并提供显式装箱和拆箱功能。因为java.lang.Long是引用类型,所以作为数组元素使用没有任何限制。

【讨论】:

  • 作为一个附带问题,[] 类型的 Java 类名称是什么?也就是说,如果列表类型可以有IShow,它的名称是什么?
  • 列表类型构造函数为PreludeBase.TList
  • 但实例内部名称将是IShow_[],它被修改为IShow_$lbrack$rbrack
  • 此外,当您的类型名称不是有效的 Java 标识符时,它将被破坏。例如,O'Brian 在 Frege 中是有效的类型名称,但在 Java 中不是
猜你喜欢
  • 2014-01-29
  • 1970-01-01
  • 2011-02-06
  • 2020-08-08
  • 1970-01-01
  • 1970-01-01
  • 2019-05-23
  • 2014-12-20
相关资源
最近更新 更多