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
代替use
; use
用于从状态获取(因此 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
),所以现在你需要把它变成一个 Getting
和 to
。
λ> 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
,所以这就是您想要的。)
我尝试为两个类型为
的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
代替use
; use
用于从状态获取(因此 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
),所以现在你需要把它变成一个 Getting
和 to
。
λ> 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
,所以这就是您想要的。)