扩展F#列表模块

时间:2009-10-01 18:31:56

标签: list f# module extension-methods

我一直在为一些F#模块添加一些方便的方法,比如List。

type Microsoft.FSharp.Collections.FSharpList<'a> with          //'
    static member iterWhile (f:'a -> bool) (ls:'a list) = 
        let rec iterLoop f ls = 
            match ls with
            | head :: tail -> if f head then iterLoop f tail
            | _ -> ()
        iterLoop f ls

我想知道是否可以添加突变?我知道List是不可变的,那么如何向Ref类型List添加一个可变方法。这样的事情。

type Ref<'a when 'a :> Microsoft.FSharp.Collections.FSharpList<'a> > with //'
    member this.AppendMutate element =
        this := element :: !this

或者是否有某种方法可以将泛型约束为仅接受可变的?

2 个答案:

答案 0 :(得分:3)

不幸的是,似乎无法将扩展成员添加到封闭的构造类型(例如Ref<int>Seq<string>)。这也适用于您尝试使用的代码,因为您将更具体的类型'a list替换为开放通用'T类型的通用参数Ref<'T>

答案 1 :(得分:3)

现在可以在F#3.1中使用通用扩展方法:

open System.Runtime.CompilerServices

[<Extension>]
type Utils () =
    [<Extension>]
    static member inline AppendMutate(ref: Ref<List<'a>>, elt) = ref := elt :: !ref

let ls = ref [1..10]

ls.AppendMutate(11)

printfn "%A" ls