Haskell:如何使用标定透镜访问Linear.V或Linear.Matrix的各个元素?

问题描述 投票:1回答:2

我正在学习如何使用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也是)。就我而言,我只是想...

haskell linear-algebra lens
2个回答
0
投票

没有逃脱水果沙拉的简单方法。我的意思是说,没有使用Lens索引到Linear的简便方法。

作为V4实例的每个类型都有其他两个与之关联的类型:将indexes


0
投票
ixV4的设计似乎不支持比定义类似的东西更干净的东西
© www.soinside.com 2019 - 2024. All rights reserved.