gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 08:42:33 26 4
gpt4 key购买 nike

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

许多具有 map 的编程语言也有称为 flatMap 的东西(或 monadic bindcollectSelectManymapcanappend-map) 做同样的事情,但允许(或要求)报告者任务报告结果列表.最终结果是包含所有串联结果列表的单个列表。

在 Logo 中(包括在 NetLogo 中),串联部分称为 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]

sentence-map如何实现,实现效率高吗?

最佳答案

定义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(n2),因为this NetLogo bug (根本原因是 this Scala bug )。

如果由于某种原因你无法使用旧版本的 NetLogo,你可以通过编写你自己的 sentence 版本来解决这个问题,它通过重复调用 lput,然后在 sentence-map 中使用它。

关于functional-programming - NetLogo:如何实现 `sentence-map`(又名 `flatMap`)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21997327/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com