Haskell 镜头 getter 比较两个镜头 getter 的值

Haskell lens getter that compares values of two lens getters

我尝试为两个类型为

lensgetter写一个大于等于的比较运算符
(.>=.) :: Ord a => Getting a s a -> Getting a s a -> Getting Bool s Bool

我有一个工作解决方案,左边是 getter,右边是值(运算符 .>= 右边没有 .

left .>= right = left . to (>= right)

我试过了

left .>=. right = (>=) <$> use left <*> use right

但它有类型

(.>=.) :: (Ord a, MonadState s f) => Getting a s a -> Getting a s a -> f Bool

如何获得所需的 return 类型 Getting Bool s Bool 而不是 f Bool

你已经接近了:

λ> left .>=. right = (>=) <$> use left <*> use right
(.>=.) ::
  (Ord a, Control.Monad.State.Class.MonadState s f) =>
  Getting a s a -> Getting a s a -> f Bool

首先,用view代替useuse 用于从状态获取(因此 MonadState 约束),这在这里似乎不相关。

λ> left .>=. right = (>=) <$> view left <*> view right
(.>=.) ::
  (Ord a, Control.Monad.Reader.Class.MonadReader s f) =>
  Getting a s a -> Getting a s a -> f Bool

这给了你一个函数(MonadReader s f => f Bool 专门针对 s -> Bool),所以现在你需要把它变成一个 Gettingto

λ> left .>=. right = to $ (>=) <$> view left <*> view right
(.>=.) ::
  (Ord a, Contravariant f, Profunctor p) =>
  Getting a s a -> Getting a s a -> Optic' p f s Bool

(并且 (Contravariant f, Profunctor p) => Optic' p f s Bool 专用于 Getting Bool s Bool,所以这就是您想要的。)