据我所了解,每个van Laarhoven光学类型可以通过对类型构造函数的限制来定义:
如果我们选择
我的直觉是,
我感兴趣的原因是,van Laarhoven 光学的类型与修改“可变引用”类型(如
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
类型做一些事情;只是我不确定我们能否从中获得任何特别有用的东西。我感兴趣的原因是,van Laarhoven 光学的类型与修改“可变引用”类型(如
IORef
)的函数的类型非常相似。例如,我们可以轻松地实现modifyIORefM :: MonadIO m => IORef a -> (a -> m a) -> () -> m ()
当部分应用于 IORef
时,具有以下形式
type SomethingIO s t a b = forall f. MonadIO f => (a -> f b) -> s -> f t
当 a = b
且 s = t = ()
时,我不确定这是一个有意义的还是无意义的巧合。