这一行Clojure代码的作用是什么?
单词是字符串向量,索引是非负整数序列。我知道#(…)是一个匿名函数,%表示它的参数。我认为这样做的目的是在指定的索引处获取单词,但是有人可以将匿名函数重写为更容易理解的函数吗?这只是编写这一行Clojure代码的作用是什么?,clojure,functional-programming,anonymous-function,Clojure,Functional Programming,Anonymous Function,单词是字符串向量,索引是非负整数序列。我知道#(…)是一个匿名函数,%表示它的参数。我认为这样做的目的是在指定的索引处获取单词,但是有人可以将匿名函数重写为更容易理解的函数吗?这只是编写(映射单词索引)的一种不好的方法。我不知道函数words做什么,也不知道索引的值是什么,但此代码对索引的每个元素调用函数words一次,并返回一系列结果。如果我理解正确,您有: (map #(words %) indexes) clojure的优点之一是,标准数据结构也是其成员的函数。这意味着以下各项是等效的:
(映射单词索引)
的一种不好的方法。我不知道函数words
做什么,也不知道索引的值是什么,但此代码对索引的每个元素调用函数words
一次,并返回一系列结果。如果我理解正确,您有:
(map #(words %) indexes)
clojure的优点之一是,标准数据结构也是其成员的函数。这意味着以下各项是等效的:
(def words ["who" "what" "where" "when"])
(def indexes (range 4))
(map #(words %) indexes)
=> ("who" "what" "where" "when")
这也适用于贴图和集合。前者接受一个键并返回值。后者在列表中查找参数,如果找到或为nil,则返回该参数
(get words 1)
=> "what"
(words 1)
=>"what"
相当于
(def words ["apple" "banana" "cantaloupe" "date" "fig"])
(ifn? words) ;=> true
(words 0) ;=> "apple"
(words 1) ;=> "banana"
所以
相当于(一个惰性序列)
不过单词不是函数,它是字符串向量。@user1136342关键字vector
,它不是函数,但实现了Ifn
接口。如果你在最初的帖子中使用了这一点,并给出了一个例子,我们就不用猜了!但是,这个答案仍然是正确的。不需要匿名函数,只需要(映射词索引)
,因为Ifn
作为get
为vector
s.@A.Webb,我质疑“不是函数”:它绝对是一个函数,因为它实现了Ifn
。这只是一个用[]
定义的函数,而不是(fn…
@amalloy是的,这太草率了——不是fn?
函数。谢谢你的评论!对于向量v
,(vx)
并不严格等同于(get vx)
。具体来说,如果x
不是整数,或者在v
的索引范围之外,(vx)
将抛出异常,而(get vx)
将返回nil。
(get words 0) ;=> "apple"
(get words 1) ;=> "banana"
(map #(words %) [0 1])
((get words 0) (get words 1))