首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >‘`lens`’是如何工作的?

‘`lens`’是如何工作的?
EN

Stack Overflow用户
提问于 2013-09-23 02:08:39
回答 1查看 377关注 0票数 1

我的意思是,不是像这样简单的东西(来自here):

代码语言:javascript
复制
strike :: StateT Game IO ()
strike = do
    lift $ putStrLn "*shink*"
    boss.health -= 10

但是像使用镜头来映射来自Linear的类型。我该如何用镜头来表达呢:

代码语言:javascript
复制
vecMod :: (Integral a) => V2 a -> V2 a -> V2 a
vecMod (V2 x1 y1) (V2 x2 y2) = V2 (x1 `mod` x2) (y1 `mod` y2)

另一个例子:我当前的代码充满了这样的小表达式:

代码语言:javascript
复制
isAt :: Thing -> Position -> Game Bool
isAt thing pos = do
  b <- use board
  return $ elem thing (b ! pos)

(板材为Array (V2 Int))

我想(在lens中)有一种更规范的方式来表达这一点。

总而言之:我如何找出什么镜头可以做,什么不能做,以及它是如何做到的?

EN

回答 1

Stack Overflow用户

发布于 2013-09-23 02:17:53

第一个vecMod很容易简化:

代码语言:javascript
复制
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具有应用性。

第二个已经相当简洁了。如果你发布一组这样的代码片段,我们可以帮助你抽象出一些东西。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18947136

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档