Functional programming NetLogo:如何实现“句子地图”(又称“平面地图”)?
NetLogo有一个Functional programming NetLogo:如何实现“句子地图”(又称“平面地图”)?,functional-programming,netlogo,Functional Programming,Netlogo,NetLogo有一个map原语,它对输入列表的每个元素运行一个报告器任务,并收集一个结果列表 许多有map的编程语言也有一个名为flatMap(或monadicbind或collect或SelectMany或mapcan或append map)的程序,它做同样的事情,但允许(或要求)报告者任务报告结果列表。最终结果是一个包含所有串联结果列表的单一列表 在Logo(包括NetLogo)中,连接部分称为句子,因此将映射与连接相结合的操作的好名称可能是句子映射 例如,我们想要: observer>
map
原语,它对输入列表的每个元素运行一个报告器任务,并收集一个结果列表
许多有map
的编程语言也有一个名为flatMap
(或monadicbind
或collect
或SelectMany
或mapcan
或append map
)的程序,它做同样的事情,但允许(或要求)报告者任务报告结果列表。最终结果是一个包含所有串联结果列表的单一列表
在Logo(包括NetLogo)中,连接部分称为句子
,因此将映射与连接相结合的操作的好名称可能是句子映射
例如,我们想要:
observer> show sentence-map task [list ? ?] [1 2 3]
observer: [1 1 2 2 3 3]
请注意,语句
并不要求所有输入都是列表。例如,(句子1[2 3]4)
的计算结果为[1 2 3 4]
。因此,我们对句子映射的定义也将如此。例如:
observer> show sentence-map task [ifelse-value (? mod 2 = 0) [(list ? ?)] [?]] [1 2 3]
observer: [1 2 2 3]
如何实现句子映射
,实现效率如何?定义句子映射
最简单的方法如下:
to-report sentence-map [f xs]
report reduce sentence map f xs
end
至于效率,如果您使用的是NetLogo 5.0.5或更高版本,那么这个定义应该表现良好(O(n)-ish运行时)
在NetLogo 5.0.4和早期版本中,反复使用语句
将使总时间O(n2)由于(根本原因是)
如果出于某种原因,您无法使用旧版本的NetLogo,您可以编写自己版本的语句
,通过反复调用lput
,进行连接,然后使用语句映射内的语句
reduce
可应用于海龟集
,补丁集
,并将补丁集
链接到类似的一端。例如,要获取turtleset中我的链接邻居的链接邻居,可以执行减少链接邻居的turtleset[link neights]。