Jde ve staticky typovaném jazyce implementovat matice s generickými prvky? Pokud ano, jak?
Např. v C++ bych mohl mít Matrix<double> nebo Matrix<Vector>, ale mně jde o to, aby v jedné matici mohly být prvky různých typů při zachování statické kontroly. Příkladem budiž třeba výpočet vektorového součinu pomocí determinantu (matice obsahuje vektory i skaláry a výsledkem je vektor).
Let's take any language, say, Swift (pun intended)

protocol MatrixElementType {
func +(x:MatrixElementType, y:MatrixElementType) -> MatrixElementType
func *(x:MatrixElementType, y:MatrixElementType) -> MatrixElementType
}
extension Double : MatrixElementType {}
struct Vector : MatrixElementType {
let data:[Double]
var dimension:Int { return data.count }
}
struct Matrix {
let data:[MatrixElementType]
let dimension:Int
init(data:[MatrixElementType]) { self.data = data; dimension = Math.sqrt(data.count) }
subscript(index:(row:Int,column:Int)) -> MatrixElementType {
get { return data[index.row * dimension + index.column] }
}
func firstMinor(row row:Int, column:Int) -> MatrixElementType {
...
}
var determinant:MatrixElementType {
if dimension == 1 { return data[0] }
else {
...
}
}
}
let m = Matrix(data: [ Vector(data: [ 1, 0, 0 ]), Vector(data: [ 0, 1, 0 ]), Vector(data: [ 0, 0, 1 ]), 2, 0, 0, 0, 2, 0 ])
print(m)
print(m.determinant)
Po přepsání tento kód funguje v každém jazyce s šablonami a přetěžováním operátorů, jen vypadá hnusněji. To zadání by bylo hezký příklad ke zkoušce
