注意:我最后添加了很多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
在这个问题之后我想知道如何(或者如果)我可以扩展通用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#数组基于任意索引数组切片数组?
例如:
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]直接使用会更好.
我正在尝试编写扩展名'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,还是有任何解决方法?