我正在学习如何使用linear,从一些教程中,我发现它看起来像是设计用于lens。我是两者的初学者(坦率地说,也是Haskell的初学者。)>
就我而言,我只想访问(并最终修改)V4
向量和V4
矩阵中的单个元素。
到目前为止,我已经设法通过M44
定义的M44
,_x
,_y
和_z
镜头访问元素]]
_w
然而,从这一点出发,我需要了解两件相关的事情。
第1部分
我该如何翻译最后的“设置”操作以使用名为Lens的功能?
例如:
Linear.V4
我对这种方法也不太满意:
λ> import Linear.V4 λ> import Control.Lens λ> view _x (V4 1 2 3 4) -- equivalent to V4 1 2 3 4 ^. _x 1 λ> m = identity :: M44 Double λ> view _x $ view _y m -- access element [row=1, col=0] λ> m & _y . _w .~ (2.0) V4 (V4 1.0 0.0 0.0 0.0) (V4 0.0 1.0 0.0 2.0) (V4 0.0 0.0 1.0 0.0) (V4 0.0 0.0 0.0 1.0)
我假设我需要以某种方式将设置和查看操作与两个镜头组合在一起,以便它们形成对相关元素的单一引用,但是我不清楚如何执行此操作,因此找不到任何合适的示例。
第2部分
如何使用分度镜访问λ> set _w (2.0) $ view _y m
V4 0.0 1.0 0.0 2.0 -- returns a V4 not a V4 (V4 Double)
或λ> (view _w $ view _y m) .~ 2.0
• Couldn't match type ‘Double’
with ‘(a0 -> Identity Double) -> s -> Identity t’
arising from a functional dependency between:
constraint ‘mtl-2.2.2:Control.Monad.Reader.Class.MonadReader
(V4 (V4 (ASetter s t a0 Double))) ((->) (M44 Double))’
arising from a use of ‘view’
instance ‘mtl-2.2.2:Control.Monad.Reader.Class.MonadReader
r ((->) r)’
的元素?例如,如果我需要访问元素[2,3]而不是V4
,然后再访问M44
?我看到_z
是类型类_w
的一个实例,因此在阅读之后,我认为我可以执行以下操作:
V4
我无法正确显示该错误消息。
[将这两个部分放在一起,我想做的是获取/设置
Ixed
矩阵的各个元素,如果λ> (V4 1 2 3 4) ^. (ix 2) • Could not deduce (Num (Linear.Vector.E V4)) arising from the literal ‘2’ from the context: (Num a, Monoid a) bound by the inferred type of it :: (Num a, Monoid a) => a
是唯一/最佳选择,那么我更喜欢写我的镜头的代码,使用Lens函数的描述性名称,而不是标点符号的水果沙拉,至少直到我对库有了更多的经验为止。
要清楚,索引需要在运行时执行。这样做的动机是,我拥有一个现有的(非常简单的)矩阵抽象层,该层具有一组现有的单元测试,其中一些检查各个矩阵元素是否接近相等,有时作为运行时循环的一部分。当前,抽象层使用的是朴素的矩阵实现,这非常慢,因此我想将M44 Double
之类的性能库集成到抽象中,但为此,我需要支持运行时索引寻址以使测试通过。
我正在学习如何使用线性,从几本教程中,我发现它看起来像是设计用于镜头。我是两者的初学者(坦率地说,Haskell也是)。就我而言,我只是想...
没有逃脱水果沙拉的简单方法。我的意思是说,没有使用Lens
索引到Linear
的简便方法。
作为V4
实例的每个类型都有其他两个与之关联的类型:将indexes
ixV4
的设计似乎不支持比定义类似的东西更干净的东西