[Haskell-cafe] Simple matrix

Bjorn Lisper lisper at it.kth.se
Thu Jun 22 09:37:42 EDT 2006


Udo Stenzel:
>Bjorn Lisper wrote:
>> Here is one way to do it. First, you have to interpret operations on
>> matrices as being elementwise applied. E.g, (*) is interpreted as zipWith
>> (zipWith (*)) rather than matrix multiply
>
>What's this, the principle of greatest surprise at work?  Nonono, (*)
>should be matrix multiplication, fromInteger x should be (x * I) and I
>should be the identity matrix.  Now all we need is an infinitely large
>I, and that gives:
>
>instance Num a => Num [[a]] where
>	(+) = zipWith (zipWith (+))
>	(-) = zipWith (zipWith (-))
>	negate = map (map negate)
>	fromInteger x = fix (((x : repeat 0) :) . map (0:))
>	m * n = [ [ sum $ zipWith (*) v w | w <- transpose n ] | v <- m ] 

There are pros and cons, of course. Using (*) for matrix multiply is
well-established in linear algebra. But:

- it breaks the symmetry. This particular operator is then overloaded in a
  different way than all the others, and

- your definition of fromInteger will behave strangely with the elementwise
  extended operations, like (+). 1 + [[1,2],[3,4]] will become
  [[2,2],[3,5]] rather than [[2,3],[4,5]]. Array languages supporting this
  kind of overloading invariably have the second form of semantics.

Björn Lisper


More information about the Haskell-Cafe mailing list