2012-06-25 2 views
-1

У меня возникла идея написать матричное деление в Haskell как Muliply A* Inverse B.Смуты с разделением матриц

Я написал код для этого, но у компилятора была идея остановить меня. Он показывает следующую ошибку:

Invalid type signature :MatrixDivision :: Matrix-> Matrix-> Matrix at line 86:1 
Should be of (variable)::(Type) 

Что я не так? Это код:

import List 

type Vector = [Int] 
type Matrix = [Vector] 

--basic constructions for vectors 

zeroVector :: Int -> Vector 
zeroVector n = replicate n 0 

--basic operations for vectors 

dotProduct :: Vector -> Vector -> Int 
dotProduct v w = sum (zipWith (*) v w) 

vectorSum :: Vector -> Vector -> Vector 
vectorSum = zipWith (+) 

vectorScalarProduct :: Int -> Vector -> Vector 
vectorScalarProduct n vec = [ n * x | x <- vec ] 

--basic constructions for matrices 

-- elemMatrix n i j v is the n-by-n elementary matrix with 
-- entry v in the (i,j) place 
elemMatrix :: Int -> Int -> Int -> Int -> Matrix 
elemMatrix n i j v = 
    [ [ entry row column | column <- [1..n] ] | row <- [1..n] ] 
    where 
    entry x y 
    | x == y   = 1 
    | x == i && y == j = v 
    | otherwise  = 0 

idMatrix :: Int -> Matrix 
idMatrix n = elemMatrix n 1 1 1 

zeroMatrix :: Int -> Int -> Matrix 
zeroMatrix i j = replicate i (zeroVector j) 

--basic operations for matrices 

matrixSum :: Matrix -> Matrix -> Matrix 
matrixSum = zipWith vectorSum 

matrixScalarProduct :: Int -> Matrix -> Matrix 
matrixScalarProduct n m = [ vectorScalarProduct n row | row <- m ] 

matrixProduct :: Matrix -> Matrix -> Matrix 
matrixProduct m n = [ map (dotProduct r) (transpose n) | r <- m ] 

{- The determinant and inverse functions given here are only for examples 
of Haskell syntax. Efficient versions using row operations are implemented 
in RowOperations.hs .-} 

--determinant using cofactors 

remove :: Matrix -> Int -> Int -> Matrix 
remove m i j 
    | m == [] || i < 1 || i > numRows m || j < 1 || j > numColumns m = 
    error "(i,j) out of range" 
    | otherwise = transpose (cut (transpose (cut m i)) j) 

determinant :: Matrix -> Int 
determinant [] = error "determinant: 0-by-0 matrix" 
determinant [[n]] = n 
determinant m = sum [ (-1)^(j+1) * (head m)!!(j-1) * determinant (remove m 1 j) | j <- [1..(numColumns m) ] ] 

--inverse 

cofactor :: Matrix -> Int -> Int -> Int 
cofactor m i j = (-1)^(i+j) * determinant (remove m i j) 

cofactorMatrix :: Matrix -> Matrix 
cofactorMatrix m = [ [ (cofactor m i j) | j <- [1..n] ] | i <- [1..n] ] 
    where 
    n = length m 

inverse :: Matrix -> Matrix 
inverse m = transpose [ [ quot x (determinant m) | 
    x <- row ] | row <- (cofactorMatrix m) ] 

--Matrix Division 

MatrixDivision :: Matrix -> Matrix -> Matrix 
MatrixDivision m n = matrixProduct m inverse(n) 

Я написал полный код для получения дополнительной информации.

+0

Возможный дубликат [Почему Haskell заставляет первое письмо конструктора данных иметь верхний регистр?] (Http://stackoverflow.com/questions/6237775/why-does-haskell-force-data-constructors-first-letter- to-be-upper-case) – Lambdageek

+0

.., и вам нужно отступать на охрану '|' на один после 'entry xy' в предложении' where' 'elemMatrix'. – AndrewC

ответ

3

На уровне выражения имена, начинающиеся с буквы верхнего регистра, зарезервированы для конструкторов данных.

Ваш MatrixDivision следует назвать matrixDivision

См Section 2.4 Отчета Haskell.

1

MatrixDivision не является допустимым именем функции, потому что это верхний регистр. Назовите это matrixDivision, вместо этого.

+0

Ops, только что видели Lambdageek ответ! – lbolla

+0

благодарю вас за помощь, но все же проблема –

+0

Можете ли вы уточнить? Какую проблему вы видите? – lbolla

Смежные вопросы