Haskell “镜头”是如何工作的?

Haskell “镜头”是如何工作的?,haskell,haskell-lens,Haskell,Haskell Lens,我的意思是,不是像这样简单的东西(来自): 但是像使用镜头从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 i

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

但是像使用镜头从
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)
isAt::Thing->Position->Game Bool
我正在做一件事

b第一个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
导入控件。应用程序
数据V2 a=V2 a派生显示
实例函子V2,其中
fmap f(V2 x y)=V2(fx)(fy)
实例Applicative V2,其中
纯x=v2x
(V2 f g)(V2 x y)=V2(f x)(g y)
vecMod1,vecMod2::(积分a)=>v2a->v2a->v2a->v2a
向量mod1(v2x1y1)(v2x2y2)=V2(x1`mod`x2)(y1`mod`y2)
vecMod2=liftA2 mod
你可以看到liftA2的工作原理,因为我以一种显而易见的方式使V2变得实用


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

第一个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
导入控件。应用程序
数据V2 a=V2 a派生显示
实例函子V2,其中
fmap f(V2 x y)=V2(fx)(fy)
实例Applicative V2,其中
纯x=v2x
(V2 f g)(V2 x y)=V2(f x)(g y)
vecMod1,vecMod2::(积分a)=>v2a->v2a->v2a->v2a
向量mod1(v2x1y1)(v2x2y2)=V2(x1`mod`x2)(y1`mod`y2)
vecMod2=liftA2 mod
你可以看到liftA2的工作原理,因为我以一种显而易见的方式使V2变得实用


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

Hmm好的。。。这比较容易,对吧。但是关于如何在
lens
库中找到有用信息的问题仍然存在。V2的Functor/Applicative实例已经在线性package@bennofs是的。。。我注意到了。实际上我在想元组,那里没有这样的方法。。。这比较容易,对吧。但是关于如何在
lens
库中找到有用信息的问题仍然存在。V2的Functor/Applicative实例已经在线性package@bennofs是的。。。我注意到了。实际上,我在考虑不存在此类方法的元组。第二个元组可以写成
get elemOf(board.ix pos.traverse)thing
,不确定这是否正确simpler@bennofs不是真的:)嗯。。。如何从:
板中获得结果。ix位置。到(elem thing)
?第二个可以写为
get elemOf(board.ix pos.traverse)thing
,不确定是否正确simpler@bennofs不是真的:)嗯。。。如何从:
板中获得结果。ix位置。到(元素事物)