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 ]] |
这有可能吗?我该怎么办?
- 可以将Option替换为Monad,然后将State替换为Monad吗?然后,您有M1[M2[X]],只需要M2[M1[X]]。
-
我不确定是否了解此操作应该执行的操作。这是适用的状态值:State((s: Option[String]) => (s, 0))。改造它会得到什么?
-
请注意,通常,如果M具有Traverse实例且N具有应用函子,则可以使用sequence将M[N[A]]转换为N[M[A]]。但是,这在这里行不通,因为State[_, A]没有Traverse。
-
我之所以想拥有此功能,是因为我有一个状态转换器可以在S上工作,而不能在Option [S]上工作。我总是可以编写另一个可以在Option上使用的转换。我想知道是否有更优雅的方法。因此,这个问题。
有一个您不喜欢的合法实现
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状态),因此您无法使关于转换是否应返回Some或None的有用决策。您可以一直返回None,也可以一直返回Some,并且State应用程序有时会失败。无论选择哪种方法,结果类型都是没有用的。如果是None,则转换函数本身是无用的;如果是Some,则将结果键入为Option不会给您带来任何好处。