-->

如何`lens`工作?(How does `lens` work?)

2019-10-18 16:35发布

我的意思是,不要把简单的东西,像这样(从这里 ):

strike :: StateT Game IO ()
strike = do
    lift $ putStrLn "*shink*"
    boss.health -= 10

但事情喜欢用镜头映射在从类型Linear 。 我怎么会在镜头方面表示这样的:

vecMod :: (Integral a) => V2 a -> V2 a -> V2 a
vecMod (V2 x1 y1) (V2 x2 y2) = V2 (x1 `mod` x2) (y1 `mod` y2)

又如:我当前的代码是满喜欢这个小表情:

isAt :: Thing -> Position -> Game Bool
isAt thing pos = do
  b <- use board
  return $ elem thing (b ! pos)

(其中板是Array (V2 Int)

我的猜测是,有(带lens )也表示这是一个更规范的方法。

一般来说:如何才能知道镜头是能够做,什么不该和如何做?

Answer 1:

第一vecMod很容易简化:

import Control.Applicative

data V2 a = V2 a a  deriving Show

instance Functor V2 where
    fmap f (V2 x y) = V2 (f x) (f y)

instance Applicative V2 where
    pure x = V2 x x
    (V2 f g) <*> (V2 x y) = V2 (f x) (g y)

vecMod1,vecMod2 :: (Integral a) => V2 a -> V2 a -> V2 a
vecMod1 (V2 x1 y1) (V2 x2 y2) = V2 (x1 `mod` x2) (y1 `mod` y2)
vecMod2 = liftA2 mod

你可以看到liftA2工作,因为我在明显的方式进行应用性V2。

第二个是已经相当简洁。 如果您发布这样的片段的集合,我们可以帮助抽象的一些东西。



文章来源: How does `lens` work?
标签: haskell lens