在这里开始使用Haskell。它必须是非常明显的东西,但是我无法理解为什么以下简单的代码会引发"索引越界错误"。
module Main where
import Data.Matrix
import qualified Data.Vector as V
vector2Diag:: Num a => V.Vector a -> Matrix a
vector2Diag vec = setDiag (identity (V.length vec)) 0 vec where
setDiag m i v
| V.null v= m
| otherwise = setDiag (setElem (V.head v) (i,i) m) (i+1) (V.tail v)
-- | The main entry point.
main :: IO ()
main = do
putStrLn "Welcome to FP Haskell Center"
print (identity (V.length (V.replicate 4 2)))
print (vector2Diag (V.replicate 3 2))
这是错误输出:
./ Data / Vector / Generic / Mutable.hs:596(write):index out of bounds(-4,9)
答案 0 :(得分:3)
setElem
未编入索引,以1开头。
错误的发生是因为您致电setElem 2 (0,0) m
。
如果您更改
中的0
vector2Diag vec = setDiag (identity (V.length vec)) 0 vec where
到1
,它会执行您要尝试的操作。