【问题标题】:How to define a list of Types in clojure?如何在 clojure 中定义类型列表?
【发布时间】:2012-07-19 19:57:38
【问题描述】:

我想要一些东西来定义我的 UDT,所以下面

(defrecord Foo [a b])

现在我可以将这种类型的实例声明为

(def f (Foo. 10 20))

但是我如何在 clojure 中有一个类似 java 的数组。

我想要new ArrayList<Foo>()(或类似的东西),这样我就可以反复调用 Add 方法来将新的 Foo 添加到列表中。

似乎找不到办法。

编辑:

我需要告诉 clojure 将我的东西映射到 Foo 的键。所以,我需要一种方法来说明我的 foo 数据,然后用它制作一个 Foo 类型的 ArrayList

(defrecord Foo [a b c])
(def foo-data
  [ "foo1"   1 8
    "foo2"   2 7
    "foo3"   3 6
    "foo4"   4 5])

我可以通过 doseq 访问这些,但是我需要创建一个 ArrayList 然后使用 做一些操作。

【问题讨论】:

    标签: clojure


    【解决方案1】:

    我建议使用自动创建构造函数的内置 Clojure 功能:

     (defrecord Foo [a b])
    
     (->Foo 1 2)   ;; auto-generated constructor
     => #user.Foo{:a 1, :b 2}
    

    然后你可以使用标准的 Clojure 高阶函数来构造你喜欢的任何Foos 集合,例如

    (def foo-data [["Bob" 2] 
                   ["Fred" 4] 
                   ["Len" 6]])
    
    (into [] (map (partial apply ->Foo) foo-data))
    => (A vector of Foos with the provided data)
    

    【讨论】:

      【解决方案2】:

      这将很简单:

      user=> (import 'java.util.ArrayList)
      user=> (def data (ArrayList.)) 
      #'user/data
      user=> (.add data (Foo. 10 20))
      

      我建议在这种情况下使用类似于向量的 clojure 数据结构。

      向量示例:

      user=> (def data (atom []))
      #'user/data
      user=> (swap! data conj (Foo. 10 20)) ;Add item to data vector
      

      【讨论】:

      • (def data (ArrayList.)),这是在声明一个新的 ArrayList 实例,然后你在 data 上调用 add 方法吗?在这种情况下我将如何使用向量?有什么例子吗?
      • 那么,当我做 (.get data 0) 时,我如何告诉编译器我得到了一个 foo 类型?所以我必须进行强制转换,我们在 clojure 中是否也有泛型?
      • 为什么你需要告诉编译器你得到了类型 foo?您可以在某些情况下使用类型提示,但在大多数情况下,您最好接受它是一种动态语言,除非您需要返回到 Java 的接口。
      • @JimDowning 请看我编辑的问题,我可能还停留在静态语言世界的思维中..
      • 我赞同 Jim Downing 的建议。听起来您正在尝试将 Clojure 与类型系统一起使用,就好像它是 Java 一样。更好地接受 Clojure 的哲学,少考虑类型——这是阻力最小的道路!
      【解决方案3】:

      如果您不需要立即将 ArrayList 传回强类型,最好在 Clojure 中操作您的数据结构。我发现http://clojure.org/cheatsheet 的“Seq In, Seq Out”部分是一个方便的参考。如果您更喜欢通过示例学习,http://www.4clojure.com 非常适合学习数据结构转换。

      【讨论】:

        猜你喜欢
        • 2022-08-16
        • 1970-01-01
        • 2011-02-20
        • 1970-01-01
        • 2010-11-07
        • 1970-01-01
        • 2016-09-05
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多