我一直在为一些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
或者是否有某种方法可以将泛型约束为仅接受可变的?
答案 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