我开始为笛卡尔积和矩阵乘法定义自己的运算符。
使用别名为列表的矩阵和向量:
type Matrix = float list list
type Vector = float list
我可以通过编写自己的初始化代码(并获得笛卡尔积)
let inline (*) X Y =
X |> List.collect (fun x -> Y |> List.map (fun y -> (x, y)))
let createVector size f =
[0..size - 1] |> List.map (fun i -> f i)
let createMatrix rows columns f =
[0..rows - 1] * [0..columns - 1] |> List.map (fun i j -> f i j)
到目前为止,一切都很好。问题是我的定义*
抹去了正常的定义,即使我的版本只为没有自己的乘法运算符的列表定义。
文档http://msdn.microsoft.com/en-us/library/vstudio/dd233204.aspx指出“新定义的运算符优先于内置运算符”。然而,我没想到所有的数字化身都会被抹去——静态类型肯定会解决这个问题吗?
我知道可以定义一个尊重类型的全局运算符,因为 MathNet Numerics*
用于矩阵乘法。我也想走那条路,这将需要打字系统优先考虑矩阵乘法而不是笛卡尔积Matrix
类型(它们本身就是列表)。
有谁知道如何在 F# 中做到这一点?