NetLogo有一个map
原语,可以在输入列表的每个元素上运行报告任务,并收集结果列表。
许多具有map
的编程语言也有flatMap
(或monadic bind
或collect
或SelectMany
或mapcan
或{ {1}})做同样的事情,但允许(或要求)报告者任务报告结果列表。最终结果是包含所有连接结果列表的单个列表。
在Logo(包括在NetLogo中)中,串联部分称为append-map
,因此将映射与串联组合在一起的操作的良好名称可能是sentence
。
例如,我们想要:
sentence-map
请注意,observer> show sentence-map task [list ? ?] [1 2 3]
observer: [1 1 2 2 3 3]
并不要求所有输入都是列表。例如,sentence
评估为(sentence 1 [2 3] 4)
。所以我们对[1 2 3 4]
的定义也会效仿。例如:
sentence-map
如何实施observer> show sentence-map task [ifelse-value (? mod 2 = 0) [(list ? ?)] [?]] [1 2 3]
observer: [1 2 2 3]
,实施效率如何?
答案 0 :(得分:3)
定义sentence-map
的最简单方法如下:
to-report sentence-map [f xs]
report reduce sentence map f xs
end
至于效率,如果您使用NetLogo 5.0.5或更高版本,此定义应该运行良好(O(n)-ish运行时)。
在NetLogo 5.0.4及更早版本中,重复使用sentence
会使总时间O(n 2 )归因于this NetLogo bug(其根本原因)是this Scala bug)。
如果由于某种原因您使用较旧版本的NetLogo,您可以通过编写自己的sentence
版本来解决问题,通过反复调用lput
进行连接,然后使用在sentence-map
内。