gpt4 book ai didi

java - 如何将整数列表从 Clojure 传递给 Frege 函数?

转载 作者:搜寻专家 更新时间:2023-11-01 02:05:43 25 4
gpt4 key购买 nike

受到上一个问题的启发what is the easiest way to pass a list of integers from java to a frege function?以及@Ingo 对答案的评论,我试过了

(Foo/myfregefunction (java.util.List. [1,2,3,4]))

但是得到(ctor = constructor):

CompilerException java.lang.IllegalArgumentException: No matching ctor found for interface java.util.List

有什么想法吗?至少 java.util.List 没有产生 ClassCastException;这是否意味着这是在正确的轨道上?

我可以从 Clojure 向 Frege 发送几乎任何 Java 集合类型,参见 Converting Clojure data structures to Java collections .

顺便说一句,使用普通 (Foo/myfregefunction [1,2,3,4]) 会产生 ClassCastException clojure.lang.PersistentVector cannot be cast to free.runtime.Lazy,@Ingo 指出,“clojure 列表不是 frege 列表。”转换为 java.util.ArrayList 时的类似响应。

在弗雷格这边,代码是这样的

module Foo where

myfregefunction :: [Int] -> Int
-- do something with the list here

最佳答案

好吧,我不懂 Clojure,但是根据你提供的链接,我认为你需要给出一个可实例化类的名称(即 java.util.ArraList),因为 java.util .List 只是一个接口(interface),因此无法构造。

对于 Frege 端,在这种情况下是消费者,假设接口(interface)就足够了。

整个事情变得有点复杂,因为 Frege 知道 java 列表是可变的。这意味着不存在纯函数

∀ s a. Mutable s (List a) → [a]

并且每次用纯语言编写这样的函数的尝试都必须失败,并且会被编译器拒绝。

相反,我们需要的是一个 ST 操作来包装纯部分(在本例中,您的函数 myfregefunction)。 ST 是使处理可变数据成为可能的单子(monad)。这将是这样的:

import Java.Util(List, Iterator)   -- java types we need

fromClojure !list =
List.iterator list >>= _.toList >>= pure . myfregefunction

从 clojure,你现在可以调用类似的东西(如果我把 clojure 语法弄错了请原谅我(欢迎编辑)):

(frege.prelude.PreludeBase$TST/run (Foo/fromClojure (java.util.ArrayList. [1,2,3,4])))

恕我直言,这种通过 Java 的接口(interface)有两个缺点。首先,我们引入了可变性,Frege 编译器不允许我们忽略它,因此接口(interface)变得更加复杂。此外,列表数据将被复制。我不知道 Clojure 是怎么做到的,但至少在 Frege 方面,有这段代码遍历迭代器并将数据收集到 Frege 列表中。

所以更好的方法是让 Frege 知道什么是 clojure.lang.PersistentVector 并直接在 Frege 中处理 clojure 数据。我知道有人用 clojure 持久性 HashMap 以这种方式做到了这一点,所以我想应该可以对列表做同样的事情。

(此时我不得不指出贡献一个深思熟虑的 Clojure/Frege 接口(interface)库是多么有值(value)!)

编辑:正如@0dB 的 self 回答所暗示的那样,他即将实现前几段中提到的卓越解决方案。我鼓励大家通过投票支持这项崇高的事业。

第三种方法是直接在 Clojure 中构造 Frege 列表。

关于java - 如何将整数列表从 Clojure 传递给 Frege 函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34379301/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com