在Clojure中,作为映射函数的键和作为映射函数的键如何以相同的方式工作?

在Clojure中,作为映射函数的键和作为映射函数的键如何以相同的方式工作?,clojure,Clojure,而且 ({:x 10, :y 20, :z 50} :y) gives 20 在这两种情况下,它是如何在内部工作的 对于作为函数的映射,我可以理解,您可以通过理解第一个值是映射来区分形式 但钥匙是如何成为一种功能的呢?在运行时,键可以是任何类型的值,那么运行时如何理解它必须将此值视为函数呢?映射是函数,来自: 映射实现IFn,用于一个参数(键)的invoke()和可选的第二个参数(默认值),即映射是其键的函数。nil键和值都可以 因此: (:y {:x 10, :y 20, :z 50}) g

而且

({:x 10, :y 20, :z 50} :y)
gives 20
在这两种情况下,它是如何在内部工作的

对于作为函数的映射,我可以理解,您可以通过理解第一个值是映射来区分形式


但钥匙是如何成为一种功能的呢?在运行时,键可以是任何类型的值,那么运行时如何理解它必须将此值视为函数呢?

映射是函数,来自:

映射实现IFn,用于一个参数(键)的invoke()和可选的第二个参数(默认值),即映射是其键的函数。nil键和值都可以

因此:

(:y {:x 10, :y 20, :z 50})
gives 20
将函数
{:x10,:y20,:z50}
应用于
:y

关键字也是函数,引用以下内容:

关键字使用可选的第二个参数(默认值)为一个参数(映射)的invoke()实现IFn。例如(:mykey my hash map:none)的意思与(get my hash map:mykey:none)相同

因此,当您这样做时:

({:x 10, :y 20, :z 50} :y)
实际上,您使用
{:x10,:y20,:z50}
作为参数调用
:y


基本上,任何实现IFn且在类路径上的东西都可以被视为一个函数。

因此,基本上,在这种情况下,除了关键字以外的任何东西都不起作用。@AmoghtalPalikar,除非它也以与关键字相同的方式实现IFn,否则不会。使用映射作为函数可能看起来不直观,但从数学的角度来看(函数编程接近数学),函数是一张地图。一般来说,函数是一种将一些输入集X映射到一些输出集Y的关系,这种关系是分析关系(例如公式)还是元素关系(如键值映射)没有区别。例如,灰度图像
I
可被视为将一对坐标
(x,y)
映射到像素值的函数,即
I(x,y)=值
。因此,让maps在Clojure中实现
IFn
是有意义的。(关键字实现它只是为了方便)。同样值得注意的是,符号实现ifn-
('a'{a0b1c2})
(:y {:x 10, :y 20, :z 50})