Functional programming NetLogo:如何实现“句子地图”(又称“平面地图”)?

Functional programming NetLogo:如何实现“句子地图”(又称“平面地图”)?,functional-programming,netlogo,Functional Programming,Netlogo,NetLogo有一个map原语,它对输入列表的每个元素运行一个报告器任务,并收集一个结果列表 许多有map的编程语言也有一个名为flatMap(或monadicbind或collect或SelectMany或mapcan或append map)的程序,它做同样的事情,但允许(或要求)报告者任务报告结果列表。最终结果是一个包含所有串联结果列表的单一列表 在Logo(包括NetLogo)中,连接部分称为句子,因此将映射与连接相结合的操作的好名称可能是句子映射 例如,我们想要: observer>

NetLogo有一个
map
原语,它对输入列表的每个元素运行一个报告器任务,并收集一个结果列表

许多有
map
的编程语言也有一个名为
flatMap
(或monadic
bind
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]。