儘可能簡單,只要我需要在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。 –