1

语境

我目前正在阅读有关 Clojure 对 monads 的实现:org.clojure/algo.monads

直观地说,reduce 看起来像是应用于地图的 state-m。基本上,有一个“状态”,它是迄今为止的价值。

现在,我无法以“标准方式”完成这项工作,因为:

(domonad state-m
   [ ... I can only stuff a constant number of things here ...
     ... but I need to stuff here a list whose size is only known at run time ... ]
    ..)

问题

有没有办法使用 state-m 将 reduce 实现为 monad?

我知道我永远不会在实践中使用它,这纯粹是为了启蒙+更好地理解事物如何组合在一起。

谢谢!

4

2 回答 2

1

我认为使用domand宏(没有运行时代码生成和评估)不可能实现您的要求。一种选择是直接使用state monadm-bindm-result函数来获得所需的行为。

于 2012-06-18T05:01:56.913 回答
0

状态单子本身没有任何列表迭代的概念。所以你不能直接使用 state monad 来做到这一点。

您可以在 a 中使用 state monadloop来模拟 reduce - 但循环本身将提供类似 reduce 的行为,state monad 本身不会真正做出任何贡献。

于 2012-06-18T10:10:20.367 回答