【问题标题】:clojure map, what is %2 and %1clojure 映射,%2 和 %1 是什么
【发布时间】:2015-10-06 04:17:24
【问题描述】:

我正在做一个clojure excersice,这是一个问题。

(true?  (__ :a {:a nil :b 2}))

答案是:

 #(nil?(%2 %1 0))

但我无法得到它。 %2 %1 0 在这里做什么? 尤其是那个 0 在那里做什么?

你能给我解释一下吗? 谢谢

【问题讨论】:

  • 不确定问题是什么。 __ 是什么? %2 和 %1 是在 #() 函数中迭代的占位符。但我看不出他们会在这里占据什么位置。或许你可以提供一些更详细的信息?

标签: clojure functional-programming


【解决方案1】:

#() 格式是定义匿名函数的简写。 例如:#(+ %1 %2) 等价于(fn [a,b] (+ a b))

这里%2%1分别代表函数的第二个和第一个参数。

【讨论】:

  • 谢谢,所以在这一行:#(nil?(%2 %1 0)) 是什么意思?为什么有一个 0 ?
  • 0 将用作默认返回值。例如,当映射 %2 根本没有匹配 ℅1 的键时。
【解决方案2】:

如前所述, #(nil? (%2 %1 0))

的糖

(fn [a-map a-key] (nil? (a-map a-key 0)))

关于这一行的几点注意事项:

  1. clojure 中的哈希映射支持函数语义,因此使用映射代替函数等同于调用get 函数

(a-map a-key default-value) 等于 (get a-map a-key default-value)

  1. 添加了零作为默认键,以区分 缺少键nil 键值。例如:

(get {:b 1} :a) 产生 nil(因为地图中没有 :a 键)

(get {:a nil :b 1} :a) 也产生nil(因为nil:a 的值)

虽然使用默认值消除了这种不确定性:

(get {:b 1} :a 0) => 0

(get {:a nil :b 1} :a 0) => 无

  1. 示例中的映射具有数值,因此使用零作为默认值可能会导致更大的混乱(嗯,取决于用例。有时零正是您需要的)。使用一些不存在的值是很常见的,例如像:not-found 这样的关键字

但在这种情况下,您可能希望以这种方式完成任务:

(true? (#(contains? %2 %1) :a {:a nil :b 2}))

因为他们显然希望您检查密钥 :a 是否存在于地图中

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-01-09
  • 1970-01-01
  • 1970-01-01
  • 2013-05-11
  • 2015-08-02
  • 2012-06-12
  • 1970-01-01
相关资源
最近更新 更多