尽可能简单,只要我需要在Haskell上使用矩阵,我就会挣扎。我的策略是选择具体类型(REPA,Vector,List,IntMap等)并为其编程。例如,我用REPA来解决欧拉的problem 11,我经常在马拉松上使用它。不幸的是,REPA并不是一个特别友好的API--它需要复杂的类型注释,考虑表示并跟踪它,并将其转换......还有,索引被逆转。所有这些意味着我花了大量的时间只是看着文档,并尝试正确地对齐类型,这在你参加马拉松比赛时是致命的。在Haskell上编程矩阵的语言学方法是什么?
我可以使用矢量/列表,但这也是很尴尬,因为那时我需要使用toIndex :: [Int] → Int; fromIndex Int → [Int]
函数,每次我索引矢量。
我也尝试创建Data.Vector的包装,如data Matrix a = Matrix { shape :: [a], buffer :: Vector a }
,但很快我注意到我还必须为每个单独的矢量函数创建一个包装,并且使用不同的类型来匹配可变的矢量等等,一团糟。
最后,我需要的是一个简单的方法来处理矩阵 - 类似:
matrix = Matrix.fromList [3,3] [1,2,3,4,5,6,7,8,9]
main = do
matrix' <- set matrix [1,1] 0
print $ get matrix [1,1]
print $ sum matrix
或其他任何东西,让我想想矩阵作为数学对象,而不是一个具体的实现,但我没有找到一种简单的语言学方法。你会怎么做?我不知道镜头能不能帮助吗?
[linear](https://hackage.haskell.org/package/linear-1.18.0.1/docs/Linear-Matrix.html)包中有一些通用的矩阵运算,用少数的泛型类型类,但是我不能很好地解释它是如何工作的。 –
如果你想要一个简单的“Haskell中的Matlab”包,请尝试[hmatrix](http://hackage.haskell.org/package/hmatrix) - 它有一个相当全面和易于理解的API。 –