【发布时间】:2018-04-05 22:02:13
【问题描述】:
大家好,我最近一直在尝试学习一门新语言,我偶然发现了 Clojure,它看起来是一门真正有趣的语言,因为我从未听说过函数式编程,尽管我之前使用过 JavaScript的杠杆作用,好吧,我将停止闲聊并进入问题。
我一直致力于解决https://github.com/gigasquid/wonderland-clojure-katas 以及更具体的双峰问题。我想我已经有了一个解决方案,但它向我发送了这篇文章标题上的错误。我已经阅读了有关此错误的信息,并且它似乎在您希望编译器需要一个函数但它没有时触发。这是我的解决方案的完整代码,看看您是否可以帮助我解决这个问题:
(ns doublets.solver
(:require [clojure.java.io :as io]
[clojure.edn :as edn]
[clojure.set :as set]))
(def words (-> "words.edn"
(io/resource)
(slurp)
(read-string)))
(defn linked-word [word word-list]
(some #(when (= (count (set/difference (into #{} (seq %))
(into #{} (seq word)))) 1) %)
word-list))
(defn doublets [word1 word2]
(let [n (count word1) v (cons word1 (filter #(= (count %) n)
(remove #{word1} words)))]
(tree-seq #(and (linked-word (% 0) %) (not= (% 0) word2))
#(cons (linked-word (% 0) (rest %))
(remove #{(% 0)} (rest %))) v)))
你可以看到 cons 是一个函数,所以错误似乎不是上面描述的情况。
【问题讨论】:
-
因为它似乎与
(% 0)的使用有关:虽然使用#(%) 对三个项目形式很好,但它很快就会变得混乱。为了可读性,您可以使用匿名 fn 来解构 args,例如:((fn [[f & r :as a]] [f r a]) [1 2 3])for first, rest, all
标签: clojure