相关疑难解决方法(0)

如何将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
查看次数

F#如何扩展泛型数组类型?

这个问题之后我想知道如何(或者如果)我可以扩展通用F#数组类型.我能做到这一点:

type System.Array with
    member a.Last = a.GetValue(a.Length - 1)
Run Code Online (Sandbox Code Playgroud)

但正如托马斯所说,它是非通用的.接下来我尝试了这个,但它不起作用:

type Microsoft.FSharp.Collections.Array with  // Error: Array is not defined      
    member a.Last = a.[a.Length - 1]
Run Code Online (Sandbox Code Playgroud)

在F#scource中我找到了这个命名空间,但它也不起作用:

type Microsoft.FSharp.Primitives.Basics.Array with  // Error: Array is not defined          
    member a.Last = a.[a.Length - 1]
Run Code Online (Sandbox Code Playgroud)

f# type-extension

6
推荐指数
1
解决办法
732
查看次数

F#按索引数组切片数组

我如何重载.[] F#数组基于任意索引数组切片数组?

例如:

let x = [|1..10|]; 
let indx = [|4;1|];
Run Code Online (Sandbox Code Playgroud)

虽然

[| for i in indx ->x.[i]|] 
Run Code Online (Sandbox Code Playgroud)

会工作,能x.[indx]直接使用会更好.

f#

2
推荐指数
1
解决办法
1478
查看次数

如何延长'T?

我正在尝试编写扩展名'T,基本上是C#中的以下内容:

public static T With<T>(this T pObject, Action<T> pAction)
{
    pAction(pObject);
    return pObject;
}
Run Code Online (Sandbox Code Playgroud)

我试着把它翻译成F#:

[<Extension>]
type Ext =
    [<Extension>]
    static member With<'T>(pObject: 'T, pAction: Action<'T>): 'T =
        pAction.Invoke(pObject);
        pObject;
Run Code Online (Sandbox Code Playgroud)

module Extensions =
    type 'T with
        member this.With(pAction: Action<'T>): 'T = Ext.With(this, pAction);
Run Code Online (Sandbox Code Playgroud)

但是这会产生错误"Unexpected keyword",其中包含'in type name.在最后一个片段中.

搜索返回了这个,但它显然只适用于数组类型:如何在F#中为T []定义类型扩展?

如何扩展泛型类型'T,还是有任何解决方法?

generics f#

0
推荐指数
1
解决办法
148
查看次数