关于scala:Scalaz:将选项状态转换为状态选项

Scalaz: transforming State of Option into Option of State

试图让我围绕Scalaz State monad和monad变形金刚。

我想做的是实现以下内容:

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

这有可能吗?我该怎么办?


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

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

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

您无法预先知道o永远不会返回None状态(即使您进一步限制了在给定Some状态时不返回None状态),因此您无法使关于转换是否应返回SomeNone的有用决策。您可以一直返回None,也可以一直返回Some,并且State应用程序有时会失败。无论选择哪种方法,结果类型都是没有用的。如果是None,则转换函数本身是无用的;如果是Some,则将结果键入为Option不会给您带来任何好处。