gpt4 book ai didi

function - Clojure 映射函数以什么方式?

转载 作者:行者123 更新时间:2023-12-04 16:23:59 24 4
gpt4 key购买 nike

在他的演讲中 "Maybe not"里奇希基说:

maps are (mathematical) functions!

in Clojure, we can directly write, and invoke

({:a 1 :b 2} :b) => 2



但是我有一种感觉,它们实际上并不是一流的 Clojure 函数,或者它们是吗?

我可以用关键字调用 map ,或者反过来:
user=> (:b {:a 1 :b 2 :c 3})
2
user=> ({:a 1 :b 2 :c 3} :b)
2

但我不能以任何一种方式使用 apply :
user=> (apply #(:b %) {:a 1 :b 2 :c 3})
ArityException Wrong number of args (3) passed to: user/eval1762/fn--1763 clojure.lang.AFn.throwArity (AFn.java:429)

user=> (apply #({:a 1 :b 2 :c 3} %) :b)
IllegalArgumentException Don't know how to create ISeq from: clojure.lang.Keyword clojure.lang.RT.seqFrom (RT.java:542)

我也不能将关键字直接应用于 map :
user=> (apply {:a 1 :b 2 :c 3} :b)
IllegalArgumentException Don't know how to create ISeq from: clojure.lang.Keyword clojure.lang.RT.seqFrom (RT.java:542)

那么它们是仅在数学意义上起作用,还是在应用类似于“正常”clojure 函数的关键字的意义上对它们有更多作用?

最佳答案

map 是键的功能,就像在前两个示例中一样。 map 工具 IFn界面就像“常规”Clojure 函数一样。

原因 apply 在您的示例中不起作用是由于在第二个位置传递了“序列”参数。

(apply #(:b %) {:a 1 :b 2 :c 3})

在该示例中,map 参数被转换为一系列键/值向量/元组,因此它们可以应用于 #(:b %) (无论如何都行不通,因为该匿名函数只接受一个参数)。这是映射被转换为序列并作为参数应用于函数时的外观:
user=> (seq {:a 1 :b 2 :c 3})
([:a 1] [:b 2] [:c 3])

第二个示例不起作用,因为 :b不是一个序列——它是一个单一的关键字。这虽然有效:
user=> (apply {:a 1 :b 2 :c 3} [:b])
2

请注意,使用 apply 调用 map-as-function但是,一系列关键字并没有真正的实际意义。

关于function - Clojure 映射函数以什么方式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55301184/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com