У меня возникла идея написать матричное деление в 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)
Я написал полный код для получения дополнительной информации.
Возможный дубликат [Почему Haskell заставляет первое письмо конструктора данных иметь верхний регистр?] (Http://stackoverflow.com/questions/6237775/why-does-haskell-force-data-constructors-first-letter- to-be-upper-case) – Lambdageek
.., и вам нужно отступать на охрану '|' на один после 'entry xy' в предложении' where' 'elemMatrix'. – AndrewC