2009-10-01 13 views
7

私はListなどのいくつかのF#モジュールに便利なメソッドをいくつか追加しています。F#リストモジュールの拡張

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 

突然変異を追加することができますか?私はリストが不変なので、リストタイプのRefに変更可能なメソッドを追加する方法は知っています。このようなもの。

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

またはジェネリックを唯一の変更可能なものにするいくつかの方法がありますか?

答えて

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 
3

残念ながら、閉鎖された構築型(例:Ref<int>またはSeq<string>)に拡張メンバを追加することはできないようです。より一般的なタイプ'a listを汎用タイプ'T(汎用タイプRef<'T>)に置き換えているので、これは使用しようとしているコードにも当てはまります。

関連する問題