据我所知,每个货车Laarhoven optic类型都可以通过类型构造函数上的约束来定义:
type Lens s t a b = forall f. Functor f => (a -> f b) -> s -> f t
type Traversal s t a b = forall f. Applicative f => (a -> f b) -> s -> f t
-- etc.
如果我们选择Monad
作为约束,它是否以一种有意义的方式形成某种“光学”?
type Something s t a b = forall f. Monad f => (a -> f b) -> s -> f t
我的直觉是,Monad
约束可能限制太多,无法从这样的结构中获取任何值:因为Const
函子不是Monad
,所以我们不能通过将f
特化为Const
来导出类似view
的函数,但是我们可以用Something
类型做一些事情;我只是不清楚我们是否能用它做些特别有用的事情。
我感到好奇的原因是,货车Laarhoven光学器件的类型与修改“可变引用”类型(如IORef
)的函数类型非常相似。
modifyIORefM :: MonadIO m => IORef a -> (a -> m a) -> () -> m ()
其在部分施加到X1 M9 N1 X上时具有如下形状
type SomethingIO s t a b = forall f. MonadIO f => (a -> f b) -> s -> f t
其中a = b
和s = t = ()
。我不确定这是一个有意义的巧合还是无意义的巧合。
1条答案
按热度按时间syqv5f0l1#
实际上,这样的光学器件是一个稍微不方便的
Traversal
。这是因为,实际上,我们使用
Traversal
:两件事,从
s
得到一个a
的列表,我们可以用Const
函子来做:并且用
b
s替换a
s以将s
转换为t
。一种方法是使用State
函子,并且忽略匹配a
s和b
s的计数的问题,我们有:如果我们改为使用
Monad
约束的光学器件:我们仍然可以执行这两个操作,因为
State
是一个单子,所以setListOf
操作可以使用相同的实现:对于
toListOf
,没有Const [a]
的Monad
示例,但是我们可以使用Writer
单子来提取a
的值,只要我们有一个虚拟的b
值来满足类型检查器:或者,因为Haskell有底部:
自包含代码: