【发布时间】:2014-12-08 00:06:52
【问题描述】:
假设我有一个 Frege 模块
module Util where
total :: [Int] -> Int
total xs = fold (+) 0 xs
如果“total”是用 Java 编写的,我可以调用它
Util.total(Arrays.asList(1,2,3));
从 Java 调用 Frege 实现的最佳方式是什么?
【问题讨论】:
假设我有一个 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 折叠数组而不进行转换。
【讨论】:
(X/foo [1,2,3])),我得到了错误ClassCastException clojure.lang.PersistentVector cannot be cast to frege.runtime.Lazy。 @Ingo,上面的答案也可以在这里使用吗?