试着围绕Scalaz State monad和monad变形金刚。
我想要做的是实现类似的东西:
def transform[S,A](o: State[Option[S], A]) :Option[State[S,A]]
这甚至可能吗?我该怎么做?
答案 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
不会带来任何结果。