当前位置:  开发笔记 > 编程语言 > 正文

如何将Clojure中的整数列表传递给Frege函数?

如何解决《如何将Clojure中的整数列表传递给Frege函数?》经验,为你挑选了1个好方法。

受上一个问题的启发,将整数列表从java传递给frege函数的最简单方法是什么?@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发送几乎任何Java集合类型的Frege,请参阅将Clojure数据结构转换为Java集合.

顺便说一句,使用plain (Foo/myfregefunction [1,2,3,4])而不是yield 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

Ingo.. 5

好的,不知道Clojure,但是从你给出的链接我接受它你需要给出一个可实例化的类的名称(即java.util.ArraList),因为java.util.List它只是一个接口,因此无法构造.

对于弗雷格方面,在这种情况下是消费者,它就足以假设接口.

整个事情变得有点复杂,因为弗雷格知道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的接口有两个缺点,恕我直言.首先,我们引入了可变性,Frege编译器不允许我们忽略它,因此接口变得更加复杂.此外,列表数据将被复制.我不知道Clojure是如何做到的,但至少在Frege方面,这个代码遍及迭代器并将数据收集到Frege列表中.

因此,更好的方法是让弗雷格知道什么clojure.lang.PersistentVector是,并直接在弗雷格的clojure数据上工作.我知道有人用clojure持久性哈希映射这样做了,所以我想应该可以为列表做同样的事情.

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

编辑:正如@ 0dB的自我回答所示,他即将实施前面段落中提到的优秀解决方案.我鼓励大家用赞成票来支持这项崇高的事业.

第三种方法是直接在Clojure中构建Frege列表.



1> Ingo..:

好的,不知道Clojure,但是从你给出的链接我接受它你需要给出一个可实例化的类的名称(即java.util.ArraList),因为java.util.List它只是一个接口,因此无法构造.

对于弗雷格方面,在这种情况下是消费者,它就足以假设接口.

整个事情变得有点复杂,因为弗雷格知道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的接口有两个缺点,恕我直言.首先,我们引入了可变性,Frege编译器不允许我们忽略它,因此接口变得更加复杂.此外,列表数据将被复制.我不知道Clojure是如何做到的,但至少在Frege方面,这个代码遍及迭代器并将数据收集到Frege列表中.

因此,更好的方法是让弗雷格知道什么clojure.lang.PersistentVector是,并直接在弗雷格的clojure数据上工作.我知道有人用clojure持久性哈希映射这样做了,所以我想应该可以为列表做同样的事情.

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

编辑:正如@ 0dB的自我回答所示,他即将实施前面段落中提到的优秀解决方案.我鼓励大家用赞成票来支持这项崇高的事业.

第三种方法是直接在Clojure中构建Frege列表.

推荐阅读
臭小子
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有