- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在conj
中,原始集合是第一个参数,在cons
中,它是第二个参数。
我是 clojure 新手,这看起来有点令人困惑。这两个函数有相似的行为,但是为什么参数顺序不同,是故意这样设计的吗?
(conj '(1 2 3) 4)
; => (4 1 2 3)
(cons 4 '(1 2 3))
; => (4 1 2 3)
<小时/>
我知道这两个函数是不同的,但是为什么 conj
和 cons
将原始集合以不同的参数顺序放置。
最佳答案
cons
传统上意味着构造新对象,将第一个参数添加到第二个参数中,这就是参数的排序方式。
这里引用了 LISP 的缺点,
In LISP jargon, the expression "to cons x onto y" means to construct a new object with
(cons x y)
但是conjoin
通常是附加在给定的数据结构上但取决于您使用的clojure数据类型。这就是为什么首先是集合,然后是要附加的元素。
让我们看看向量
;
user=> (type [3 5 7 11])
clojure.lang.PersistentVector
user=> (cons 1 [3 5 7 11])
(1 3 5 7 11)
user=> (conj [3 5 7 11] 13)
[3 5 7 11 13]
但是对于List
,conjoin
也会前置,
user=> (type '(3 5 7 11))
clojure.lang.PersistentList
user=> (cons 1 '(3 5 7 11))
(1 3 5 7 11)
user=> (conj '(3 5 7 11) 13)
(13 3 5 7 11)
doc for conj
也描述了这一点。
user=> (doc conj)
-------------------------
clojure.core/conj
([coll x] [coll x & xs])
conj[oin]. Returns a new collection with the xs
'added'. (conj nil item) returns (item). The 'addition' may
happen at different 'places' depending on the concrete type.
nil
据我所知,该命令适用于任何其他函数式语言。这是在 scala 中;
scala> 1 +: Seq(1, 3, 5)
res1: Seq[Int] = List(1, 1, 3, 5)
scala> Seq(1, 3, 5) :+ 7
res2: Seq[Int] = List(1, 3, 5, 7)
关于clojure - 为什么 conj 和 cons 的参数顺序不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48513617/
这个问题已经有答案了: What's the difference between a method and a function? (42 个回答) 已关闭 7 年前。 我知道conj(x)和x.c
我正在尝试自学 clojure。这应该只是一个简单的函数,它接受一个值并将其前面的每个值相加并返回这些值的总和。 问题是,在 loop 函数中,numbers 没有像我期望的那样用 conj 修改 -
我正在尝试自学 clojure。这应该只是一个简单的函数,它接受一个值并将其前面的每个值相加并返回这些值的总和。 问题是,在 loop 函数中,numbers 没有像我期望的那样用 conj 修改 -
我正在尝试一些 Clojure,但现在对“conj”的行为感到困惑。请参阅以下示例: user=> (conj [1 2 3] 4) [1 2 3 4] 以上是预期的。但是现在,如果我执行以下操作:
(conj (drop-last "abcde") (last "abcde")) 返回(\e \a \b \c \d) 我很困惑。在conj的文档中,我注意到 The 'addition' may
我已经解决了 4clojure.com 上的 45 个问题,并且在尝试使用递归和累加器解决一些问题的方式中,我注意到一个反复出现的问题。 我会尽我所能解释我正在做的事情,以最终得到模糊的解决方案,希望
TL; DR 假设我有一个带有模板参数T的函数,该函数以std::vector&作为输入(请参见下文),如果T是复杂类型,我想对这个 vector 进行共轭。我怎样才能做到这一点 ? 我尝试了什么在h
我是 clojure 的新手,最初我正在经历 Clojure.org和 cheatbook . 我想知道 conj 不同行为的确切原因是什么在列表和向量上。 (conj [1 2 3] 4) [1 2
((fn foo [x] (when (> x 0) (conj (foo (dec x)) x))) 5) 对于这段代码,结果是 [5 4 3 2 1]为什么不是 [1,2,3,4,5]?我看到我们
core.typed 中的以下代码片段 (defn conj-num [coll x] (conj coll (byte x))) (t/cf (t/ann conj-num (t/IFn [(t
为什么 cons 在这种情况下与lazy-seq 一起工作,而 conj 却不行? 这有效: (defn compound-interest [p i] (cons p (lazy-seq (c
在conj中,原始集合是第一个参数,在cons中,它是第二个参数。 我是 clojure 新手,这看起来有点令人困惑。这两个函数有相似的行为,但是为什么参数顺序不同,是故意这样设计的吗? (conj
为什么这一直问 jack 是否想要一杯茶而不是其他父亲。 (defn tea-anyone "Ask 'fathers' if they would like some tea" [fathe
我知道 cons 返回一个 seq,conj 返回一个集合。我还知道 conj 将项目“添加”到集合的最佳末尾,而 cons 总是将项目“添加”到前面。这个例子说明了这两点: user=> (conj
假设我写了一个函数: (defn foo [to x] (conj to x)) 并希望通过声明 to 必须实现某些协议(protocol)来记录它(如在结构/类型中 to 必须支持调用 conj)。
我想要一个原子中的映射,可以将时间作为 Unix 时间戳进行跟踪。 所以,在我的主要功能中,我有: (defn -main [& args] (println "Server is starting"
如果我执行这段代码: vector > idft( vector > * v) { for_each(v->begin(), v->end(), conj); 然后编译器给我以下错误: dft
我不知道如何解决 GCC 中的这个链接问题。 我在 Windows 8、GCC+MingWG 4.8.1 下运行 CodeBlocks 13.12。 我创建了一个包含两个文件的项目: 主.c #inc
cons 目前的行为如下: (cons '(1 2) '(3)) ;=> ((1 2) 3) 我想实现: (magic-cons '(1 2) '(3)) ;=> (1 2 3) 我找不到这方面的资源
对我来说,std::conj(double d)仅返回d类型的double会更自然,因为结果肯定是真实的。 最佳答案 因为conj是对复数的运算。它匹配从double到std::complex的隐式转
我是一名优秀的程序员,十分优秀!