NetLogo:如何实现`sentence-map`(又名`flatMap`)?

时间:2014-02-24 19:38:49

标签: functional-programming netlogo

NetLogo有一个map原语,可以在输入列表的每个元素上运行报告任务,并收集结果列表。

许多具有map的编程语言也有flatMap(或monadic bindcollectSelectManymapcan或{ {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] ,实施效率如何?

1 个答案:

答案 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内。