On Tue, 5 Jul 2005, Keean Schupke wrote: > Henning Thielemann wrote: > > >I'm uncertain about how who want to put the different kinds of > >multiplication into one method, even with multi-parameter type classes. > >You need instances > > > > (*) :: Matrix -> Matrix -> Matrix > > (*) :: RowVector -> Matrix -> RowVector > > (*) :: Matrix -> ColumnVector -> ColumnVector > > (*) :: RowVector -> ColumnVector -> Scalar > > (*) :: ColumnVector -> RowVector -> Matrix > > (*) :: Scalar -> RowVector -> RowVector > > (*) :: RowVector -> Scalar -> RowVector > > (*) :: Scalar -> ColumnVector -> ColumnVector > > (*) :: ColumnVector -> Scalar -> ColumnVector > > > >but you have to make sure that it is not possible to write an expression > >which needs > > (*) :: Matrix -> RowVector -> RowVector
This was my reply to Jacques Carette who suggested to distinguish row and column vectors by their _type_. His revised suggestion was to use phantom types. Then the types changes to (*) :: Matrix -> Matrix -> Matrix (*) :: Vector Row -> Matrix -> Vector Row (*) :: Matrix -> Vector Column -> Vector Column (*) :: Vector Row -> Vector Column -> Scalar ... but the problem remains ... > >Further you need > > transpose :: RowVector -> ColumnVector > > transpose :: ColumnVector -> RowVector > > transpose :: Matrix -> Matrix > >and you must forbid, say > > transpose :: RowVector -> RowVector > > > > > Of course if they are all of type Matrix this problem disappears. All type problems disappear when we switch to exclusive String representation. 8-] > What is the difference between a 1xN matrix and a vector? Please explain... My objections to making everything a matrix were the objections I sketched for MatLab. The example, again: If you write some common expression like transpose x * a * x then both the human reader and the compiler don't know whether x is a "true" matrix or if it simulates a column or a row vector. It may be that 'x' is a row vector and 'a' a 1x1 matrix, then the expression denotes a square matrix of the size of the vector simulated by 'x'. It may be that 'x' is a column vector and 'a' a square matrix. Certainly in most cases I want the latter one and I want to have a scalar as a result. But if everything is a matrix then I have to check at run-time if the result is a 1x1 matrix and then I have to extract the only element from this matrix. If I omit the 1x1 test mistakes can remain undiscovered. I blame the common notation x^T * A * x for this trouble since the alternative notation <x, A*x> can be immediately transcribed into computer language code while retaining strong distinction between a vector and a matrix type. More examples? More theory? _______________________________________________ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe