斯卡拉兹:将期权国家转变为国家选择权

时间:2013-12-19 18:35:52

标签: scala scalaz

试着围绕Scalaz State monad和monad变形金刚。

我想要做的是实现类似的东西:

def transform[S,A](o: State[Option[S], A]) :Option[State[S,A]]

这甚至可能吗?我该怎么做?

1 个答案:

答案 0 :(得分:3)

有一个你不喜欢的合法实现

def transform[S,A](o: State[Option[S], A]: Option[State{S,A]] = None

如果你尝试另一个实现,问题是什么时候可以转换返回一些? State[Option[S], A]Option[S] => (Option[S], A)。你正试图获得S => (S,A)。 给定s: S,您必须返回(S,A)对。将s传递到原始状态是可以的,您只需将其包装在Some中即可。但是你得到的(Option[S], A)可能缺少S。无法将其转换为(S,A)。除非你接受国家有时会失败。

你无法事先知道o将永远不会返回无状态(即使你进一步限制在给定某个状态时不返回无状态),所以你无法做到做出有用的决定,以确定转换是应该返回Some还是None。您可以始终返回None,也可以始终Some,并且State应用程序有时会失败。无论您选择哪一种,结果类型都是无用的。如果None,转换函数本身是无用的,如果Some,则将结果键入Option不会带来任何结果。