首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么->不采用(fn ...)?

为什么->不采用(fn ...)?
EN

Stack Overflow用户
提问于 2012-01-11 14:45:12
回答 3查看 145关注 0票数 0

我有以下可以工作的代码:

代码语言:javascript
复制
(def *primes*
  (let [l "2 3 5 7 11 13 17 19 23 29 31"
        f (fn [lst] (filter #(< 0 (count (str/trim %))) lst))
        m (fn [lst] (map #(Integer/parseInt %) lst))]
    (-> l
      (str/partition #"[0-9]+")
      f
      m)))

如果我将其更改为内联filter (f)并将(m)函数映射到以下内容:

代码语言:javascript
复制
(def *primes*
  (let [l "2 3 5 7 11 13 17 19 23 29 31"]
    (-> l
      (str/partition #"[0-9]+")
      (fn [lst] (filter #(< 0 (count (str/trim %))) lst))
      (fn [lst] (map #(Integer/parseInt %) lst)))))

它不能再编译了。错误是:

#<CompilerException java.lang.RuntimeException: java.lang.IllegalArgumentException: Don't know how to create ISeq from: clojure.lang.Symbol (NO_SOURCE_FILE:227)>

有人能给我解释一下吗?

我试图解决的问题是,map和filter将集合作为最后一个参数,而str/partition将集合作为第一个参数,所以我尝试使用->混合这两个参数,但将mapfilter合并到只接受一个(第一个)参数的函数中,以便进入集合。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-01-11 16:41:26

您正在使用函数声明作为函数调用。修复它的直接(丑陋)方法是替换(fn ....)使用((fn .....))

票数 2
EN

Stack Overflow用户

发布于 2012-01-11 16:40:49

您可以在一定程度上混合使用->->>

代码语言:javascript
复制
(-> l
  (str/partition #"[0-9]+")
  (->> (filter #(< 0 (count (str/trim %)))))
  (->> (map #(Integer/parseInt %))))

但通常情况下,出现这样的问题表明您试图在一种形式中做太多事情。这个简单的例子很容易修复。

代码语言:javascript
复制
(->> (str/partition l #"[0-9]+")
  (filter #(< 0 (count (str/trim %))))
  (map #(Integer/parseInt %)))
票数 3
EN

Stack Overflow用户

发布于 2012-01-23 19:08:34

->是一个宏。它操纵你给它的代码,然后执行这些代码。当你尝试以这种方式使用匿名函数时,之前的表达式会作为第一个参数被线程到fn中。这不是你想要的。您希望将它们作为实际函数的第一个参数进行线程处理。

要使用->,必须事先声明函数,就像您在第一个示例中所做的那样。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8815216

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档