相关疑难解决方法(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
查看次数

如何将LanguagePrimitives.GenericZero/get_Zero添加到System.String?

注意:我最后添加了很多Of interest评论.这些并不是在暗示一个人应该使用inlinestatic 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

8
推荐指数
1
解决办法
341
查看次数

Static extension methods supporting member 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 …

extension-methods f# type-constraints

5
推荐指数
1
解决办法
656
查看次数