我开始为笛卡尔积和矩阵乘法定义我自己的算子.
矩阵和向量别名为列表:
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 …
注意:我最后添加了很多Of interest评论.这些并不是在暗示一个人应该使用inline和static type parameters 威利愿意不愿意,他们有这么一个没有花时间搜索大量的SO与此相关的问题,以更好地理解这些概念的问题.
我知道当需要使函数通用并且需要零(0)值时,F#提供GenericZero.
解析为任何原始数字类型的零值或具有名为Zero的静态成员的任何类型.
所以这让我相信使用GenericZero字符串类型我只需要添加一个名为Zero的静态成员.
由于System.String是.Net框架的一部分,修改.Net源代码不是应该做的.但是,F#提供了Type Extensions.
类型扩展允许您将新成员添加到先前定义的对象类型.
此外,F#提供了String模块,但缺少GenericZero.
有关创建类型扩展的好教程,请参阅:将函数附加到类型.
我测试的代码:
这是在一个名为的项目中 Library1
namespace Extension.Test
module Extensions =
type System.String with
static member Something = "a"
static member StaticProp
with get() = "b"
static member Zero
with get() = "c"
Run Code Online (Sandbox Code Playgroud)
这是在一个名为的项目中 Workspace
namespace Extension.Test
module main =
open Extensions
[<EntryPoint>]
let main argv =
let stringSomething = System.String.Something
printfn …Run Code Online (Sandbox Code Playgroud) generics extension-methods f# type-inference generic-constraints
I need to implement a static extension method supporting member constraints on some basic primitive types like integers, floats, etc. Here's my code for signed integers:
module MyOperators =
let inline foo (x : ^T) = (^T : (static member Foo : ^T -> int) (x))
type System.Int32 with
static member Foo(x : Int32) = 7 // static extension
Run Code Online (Sandbox Code Playgroud)
Test code:
open MyOperators
let x = foo 5 // x should be 7
Run Code Online (Sandbox Code Playgroud)
But compiler complains with error:
The type …