【问题标题】:what is the easiest way to pass a list of integers from java to a frege function?将整数列表从java传递给frege函数的最简单方法是什么?
【发布时间】: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 实现的最佳方式是什么?

【问题讨论】:

    标签: java list interop frege


    【解决方案1】:

    您可以使用一个很好的旧 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 折叠数组而不进行转换。

    【讨论】:

    • 我正在使用 Sean Corfield 的 Leiningen 插件来编译 Frege 代码并能够从 Clojure 调用 Frege 代码。但是当我尝试调用一个需要整数列表的 Frege 函数时(比如(X/foo [1,2,3])),我得到了错误ClassCastException clojure.lang.PersistentVector cannot be cast to frege.runtime.Lazy。 @Ingo,上面的答案也可以在这里使用吗?
    • @0dB 好吧,信息很清楚。我会这样说:clojure 列表不是 frege 列表。不过,上面的答案有点过时了。如果你能设法生成一个 java.util.List,我们可能会找到一种方法将这些数据输入 Frege。不过,最好提出一个新问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-10-02
    • 2015-12-20
    • 2021-08-28
    • 2018-06-09
    • 1970-01-01
    • 2022-12-05
    • 2014-08-15
    相关资源
    最近更新 更多