1

假设我有一个 Frege 模块

module Util where

total :: [Int] -> Int
total xs = fold (+) 0 xs

如果“total”是用 Java 编写的,我可以通过

Util.total(Arrays.asList(1,2,3));

从 Java 调用 Frege 实现的最佳方法是什么?

4

1 回答 1

2

您可以使用一个好的旧 int [] 数组,相应的 frege 类型将是 JArray Int。因为数组可以由 Java 和 frege 中的列表组成,也可以组成列表,因此它们非常适合此类任务。

请使用 repl 了解如何将数组转换为列表,以便您可以将其传递给您的函数。

如果有顾虑rgd。堆空间,Data.Iterators中还有一个所谓的ArrayIterator,就是ListView类型类的一个实例。所以另一种选择是写你的 frege 以获取 ListView

total xs = fold (+) 0 xs.toList

在java中调用相当于

ArrayIterator.from (... code to create array here ...)

如果你不能改变 frege 代码,或者不想改变,你可以用

(ArrayIterator.from (... code to create array here ...)).toList

最后但并非最不重要的一点是,您可以折叠数组而不用之前转换它foldArray

于 2014-12-08T07:35:15.747 回答