索引在简单向量到矩阵函数之外的界限

时间:2014-10-24 20:31:18

标签: haskell

在这里开始使用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)

1 个答案:

答案 0 :(得分:3)

setElem未编入索引,以1开头。

错误的发生是因为您致电setElem 2 (0,0) m

如果您更改

中的0
vector2Diag vec = setDiag (identity (V.length vec)) 0 vec where

1,它会执行您要尝试的操作。