如何在haskell中定义n维向量旋转和反射?

如何在haskell中定义n维向量旋转和反射?,haskell,math,vector,transformation,n-dimensional,Haskell,Math,Vector,Transformation,N Dimensional,在Haskell中,当函数在n维中工作时,通常如何定义向量旋转和反射 目前我已经完成了点积、标准化和投影,但仍停留在反射和旋转上 data Vector s a = Vector {len::s,arr::a} normalize :: Vector s a → Vector s a normalize = toVector . uncurry (zipWith (/)) . (id&&&(repeat . sqrt . s

在Haskell中,当函数在n维中工作时,通常如何定义向量旋转和反射

目前我已经完成了点积、标准化和投影,但仍停留在反射和旋转上

data Vector s a = Vector {len::s,arr::a}

normalize :: Vector s a → Vector s a
normalize =  toVector . uncurry (zipWith (/))
                      . (id&&&(repeat . sqrt . sum . map (^2)))
                      . fromVector

dot        :: Vector s a → Vector s a → a
dot v = sum ∘ zipWith (*) (fromVector v) ∘ fromVector

project    :: Vector s a → Vector s a → Vector s a
project v = toVector ∘ uncurry (zipWith (*))
                     ∘ (fromVector&&&(repeat ∘ (v`dot`)))

我已经研究了好几天了,但是当没有清晰的代码(或者根本没有代码)时,使用Haskell来理解数学有时可能会导致问题,而且关于n维向量的唯一教程超过了我的数学知识。

数学应该能够让我们在这方面获得大部分知识;n维空间中的旋转可以被认为是基于n维对象(即平面上的点或三维空间中的线)的变换。类似地,反射可以被认为是基于n维对象的变换

尝试为小于3d矢量的对象定义旋转和小于2d矢量的对象定义反射时会遇到困难。通常的方法可能是定义两个参数的函数;一个用于旋转的矢量,另一个用于“轴”表示(2d矢量的点)

由于向量的长度(以及它变换的对象)对于确定旋转或反射是否有意义非常重要,因此这对于依赖类型(可以在类型签名中指定向量的相对长度)是一个很好的用例。不幸的是,Haskell还不完全支持这一点(虽然有些实验性语言(如Idris)也有,但您的选择相当于:

  • 将反射和旋转作为部分函数实现,当向量大小错误时失败
  • 为任何更小维度的“轴”的变换实现一个更通用的函数(实际上不确定这是否可行)
  • 尝试使用具有依赖类型的语言(如果您希望获得类型安全的保证,或
  • 让你的实现富有创意

我想说,在大多数情况下,Haskell的学术谱系对探索性数学很有用,但还不够完善。

< P>关于n维旋转的数学方面,我可以推荐印第安娜大学计算机科学系的Andrew J. Hanson的出版物,尤其是:

“N维计算机图形的旋转”

这篇论文是“N维计算机图形学的几何学”的继承者


数学需要向量算术和线性代数的知识,但如果你要执行N维变换,这是推荐的数学方法。

这些都编译了吗?现在我看不到范围内的和符号和
x
,如果你看
dot -另外:这仅仅是关于实现,还是您很难找到所述操作的数学?如果是,您可以添加预期的签名吗?它应该是:sum.zipWith(*)(fromVector v)。∘ fromVector我的编辑器默认为unicode sorrywell你应该说服你的编辑器有一个更好的复制和粘贴行为-不过:你是在寻找数学还是在翻译它时有困难?我两者都有问题。我不懂数学(我看过仿射空间、双色空间等,但目前没有任何意义)我想看看是否有一种方法可以在haskell中定义它,因为这是我的数学入门点(+需要向量来完成SICM)