f# - F# 中的全局运算符重载

标签 f# operators

我开始为笛卡尔积和矩阵乘法定义自己的运算符。

矩阵和向量别名为列表:

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# 中做到这一点?

最佳答案

这是(非惯用的)解决方案:

type Mult = Mult with
    static member inline ($) (Mult, v1: 'a list) = fun (v2: 'b list) -> 
        v1 |> List.collect (fun x -> v2 |> List.map (fun y -> (x, y))) : list<'a * 'b>
    static member inline ($) (Mult, v1:'a      ) = fun (v2:'a) -> v1 * v2 :'a

let inline (*) v1 v2 = (Mult $ v1) v2

关于f# - F# 中的全局运算符重载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19682432/

相关文章:

python - 在 Deedle 中使用默认值将列添加到数据框

.net - F# 绑定(bind)重定向不适用于 F# 4.3.0-4.3.1

asynchronous - F# 中的 F# 连续循环

f# - 如何在 [<ReflectedDefinition>] 标记模块中获取函数的 AST?

list - 如何可靠地比较列表的整数或浮点值?

案例表达式中 'or' 的 Haskell 语法

swift - 参数中的运算符(Swift)

c++ - std::array 和运算符 []

c - C 中的字符串化运算符不适用于 linux

c - 数组运算符 "-"(连字符或破折号)在 C 语言中的含义和作用是什么?