下面的代码片段:
data Circle = Circle
{ center :: Point
, radius :: Double
}
data Point = Point (Double, Double)
someFuncOverPoint :: State Point blahblah
字符串
我想知道是否有一个函数可以使someFuncOverPoint
专注于Circle
:
someMagicFunc :: ??? -> State Point blahblah -> State Circle blahblah
型
也许这可以用透镜实现?
2条答案
按热度按时间uujelgoq1#
感谢@willeM_VanOnsem的answer。
这里的动机是,我有一些层次化的数据结构和一些只关注部分上下文的有效函数,所以我需要一种方法来组合它们。
我想有个更好的办法:
字符串
我们可以反转箭头:
型
更新:经过一些研究,我发现我需要的实际上是
zoom :: Monad m => Lens' s a -> StateT a m r -> StateT s m r
类型的缩放。一般来说,如果我们想向下转换state monad中的上下文,这是微不足道的,但是如果我们想向上转换,我们可能需要像prism这样的东西来构造数据。
nhn9ugyo2#
严格地说,你可以**。事实上,我们可以通过首先生成第一个
State Point a
来创建一个状态,然后将其传递给State
,所以:字符串
所以这里我们构造一个
State
,它与一个函数一起工作,该函数将初始状态s0
Map到下一个状态s1
和结果,然后我们将其转换为一个二元组,其中Circle
作为状态,“结果”a
也是。也就是说,改变状态的类型有点奇怪。通常状态的类型在所有动作上都保持不变。