相关疑难解决方法(0)

F#中的全局运算符重载

我开始为笛卡尔积和矩阵乘法定义我自己的算子.

矩阵和向量别名为列表:

type Matrix = float list list
type Vector = float list
Run Code Online (Sandbox Code Playgroud)

我可以通过写作来编写自己的初始化代码(并将笛卡尔产品纳入讨价还价)

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)
Run Code Online (Sandbox Code Playgroud)

到现在为止还挺好.问题是我的定义*消除了正常的定义,即使我的版本仅为Lists定义,而Lists没有自己的乘法运算符.

文档http://msdn.microsoft.com/en-us/library/vstudio/dd233204.aspx声明"新定义的运算符优先于内置运算符".但是,我没想到所有的数字化身都被消灭了 - 当然静态打字会解决这个问题吗?

我知道可以定义一个尊重类型的全局运算符,因为MathNet …

f# operators

16
推荐指数
2
解决办法
1287
查看次数

内联时扩展方法出错

我想扩展一些系统类型,然后通过内联使用它们

type System.String with  
    member this.foo n = this + "!" + n 

type System.Boolean with  
    member this.foo n = sprintf "%A!%A" this n 
Run Code Online (Sandbox Code Playgroud)

现在我调用这些扩展方法

let x = "foo".foo "bar"
let y = true.foo "bar"
Run Code Online (Sandbox Code Playgroud)

这给了我这个

- val x : System.String = "foobar"
- val y : string = "true!"bar""
Run Code Online (Sandbox Code Playgroud)

所有罚款和花花公子 - 但现在我想将调用包装.foo成内联函数

let inline foo n v = (^T : (member foo : ^N  -> ^S) v, n)
let z = foo "bar" "baz" 
Run Code Online (Sandbox Code Playgroud)

只是现在我收到编译错误告诉我

> The …
Run Code Online (Sandbox Code Playgroud)

f#

4
推荐指数
1
解决办法
110
查看次数

标签 统计

f# ×2

operators ×1