Tôi nghĩ rằng ((>100).(^.foo))
có lẽ là tốt nhất bạn có thể làm chỉ bằng cách sử dụng toán tử chuẩn. Nếu bạn sẵn sàng để xác định toán tử so sánh mới cho ống kính, bạn có thể làm một cái gì đó như:
import Control.Lens hiding ((.>))
import Control.Monad (liftM2)
import Control.Monad.Reader (MonadReader)
import Data.Function (on)
(.==) :: (MonadReader s m, Eq a) => Getting Bool s a -> a -> m Bool
(.==) l = views l . (==)
infix 4 .==
(.==.) :: (MonadReader s m, Eq a) => Getting a s a -> Getting a s a -> m Bool
(.==.) = liftM2 (==) `on` view
infix 4 .==.
(.<) :: (MonadReader s m, Ord a) => Getting Bool s a -> a -> m Bool
(.<) l = views l . flip (<)
infix 4 .<
(.<.) :: (MonadReader s m, Ord a) => Getting a s a -> Getting a s a -> m Bool
(.<.) = liftM2 (<) `on` view
infix 4 .<.
(.<=) :: (MonadReader s m, Ord a) => Getting Bool s a -> a -> m Bool
(.<=) l = views l . flip (<=)
infix 4 .<=
(.<=.) :: (MonadReader s m, Ord a) => Getting a s a -> Getting a s a -> m Bool
(.<=.) = liftM2 (<=) `on` view
infix 4 .<=.
(.>) :: (MonadReader s m, Ord a) => Getting Bool s a -> a -> m Bool
(.>) l = views l . flip (>)
infix 4 .>
(.>.) :: (MonadReader s m, Ord a) => Getting a s a -> Getting a s a -> m Bool
(.>.) = liftM2 (>) `on` view
infix 4 .>.
(.>=) :: (MonadReader s m, Ord a) => Getting Bool s a -> a -> m Bool
(.>=) l = views l . flip (>=)
infix 4 .>=
(.>=.) :: (MonadReader s m, Ord a) => Getting a s a -> Getting a s a -> m Bool
(.>=.) = liftM2 (>=) `on` view
infix 4 .>=.
(.&&.) :: Monad m => m Bool -> m Bool -> m Bool
(.&&.) = liftM2 (&&)
infix 3 .&&.
(.||.) :: Monad m => m Bool -> m Bool -> m Bool
(.||.) = liftM2 (||)
infix 3 .||.
Logic đằng sau những lựa chọn nhà điều hành là dấu chấm biểu thị phía có một ống kính, vì vậy bạn có thể viết hoặc foo .== 5
hoặc foo .==. bar
(trong đó foo
và bar
là các ống kính). Thật không may, gói lens
cũng định nghĩa toán tử (.<)
của riêng mình, vì vậy có thể một số quy ước đặt tên khác sẽ tốt hơn. Đây chỉ là ý tưởng đầu tiên xuất hiện trong đầu tôi.
Sử dụng các nhà khai thác mới, bạn sẽ có thể viết những thứ như
l' = filter (foo .> 100 .&&. bar .< 50) l
này là rất tốt! Tôi tự hỏi nếu có someway để sử dụng các lớp học đa tham số loại để làm cho chỉ><= làm việc? –