我正在尝试将 Trampoline[+A] 演示为仿函数(即提供 map[B](f: A = >B))。我将 Trampoline 的经典实现理解为Stackless Scala中描述的 Monad 。
但是,有没有办法只使用 Trampoline 的 Done 和 More 子类来实现地图功能(而不是flatMap),还是我还需要添加 Flatmap 子类?
问问题
390 次
1 回答
2
你不能因为 Trampoline 代表一个计算过程。Functor 给你一个map
函数,它只能转换你的最终值,但是产生一个新的计算是 Monads 的工作,它在某种程度上抽象了计算过程,带有一个flatMap
操作(虽然我肯定更喜欢 Haskellbind
的名字,因为它是更好地表示操作的实际语义)。因此,使用仿函数,您不能将不同的计算部分链接在一起,例如在 scalaz Trampoline 是 Free Monad 的别名,它定义如下映射:
def map[B](f: A => B): Free[S, B] =
flatMap(a => Return(f(a)))
如您所见,它仅转换了一个值,但没有附加新的步骤,即您希望使用 Trampolines 实现的目标。
于 2014-06-24T10:43:45.297 回答