假设我有一个 Frege 模块
module Util where
total :: [Int] -> Int
total xs = fold (+) 0 xs
如果“total”是用 Java 编写的,我可以通过
Util.total(Arrays.asList(1,2,3));
从 Java 调用 Frege 实现的最佳方法是什么?
您可以使用一个好的旧 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
。