2012-12-24 4 views
8

'Tの演算子がインライン関数のように機能するように、私自身のクラスにIEnumerable<KeyValuePair<DateTime, 'T>>を実装し、演算子を追加したいと思っています。f#型メンバーの静的に解決された型

私は次のコードを作成できません。メンバ宣言で 'inline'キーワードの有無に関係なく動作しません。私はタイプする前に機能

let inline add l r = l + r 

を定義し、さらにl.Value + r.Valueの代わりにそれを使用する場合

また、それはまた、動作しません。

私が間違っていることを誰かに教えてもらえますか?

おそらく全体的なアプローチは間違っていて、同じ目標を他の方法で達成する方法がありますか?

namespace Test 

open System 
open System.Linq 
open System.Collections.Generic 

[<SerializableAttribute>] 
type TimeSeries<'T>(dictionary : IDictionary<DateTime, 'T>) = 
    let internalList = new SortedList<DateTime, 'T>(dictionary) 
    interface IEnumerable<KeyValuePair<DateTime, 'T>> with 
     member this.GetEnumerator() = internalList.GetEnumerator() 
     member this.GetEnumerator() : Collections.IEnumerator 
      = internalList.GetEnumerator() :> Collections.IEnumerator 
    member private this.sl = internalList 
    static member inline (+) (left : TimeSeries<'T>, right : TimeSeries<'T>) = 
     let res = 
      query { 
      for l in left do 
      join r in right on 
       (l.Key = r.Key) 
      select (l.Key, l.Value + r.Value)  
      } 
     new TimeSeries<'T>(res |> dict) 
+3

ここに私が知っている質問への最も単純な答えがあります:http://tomasp.net/blog/fsharp-generic-numeric.aspx複雑な主題。 –

答えて

6

あなたのアプローチは正しいと思われます。 あなたのコードがコンパイルされないのは、F#型の推論が、型定義のために同じ型変数'Tの静的制約(コンパイル時)を推測しているからです。

型定義のジェネリックパラメータは静的に解決できません(「ハット」型はありません)が、これらのコンパイル時の制約を使用する関数またはメンバの定義を止めるものはありません。

タイプ変数'Tを静的メンバー(+)の定義で'Uに変更するだけで問題ありません。

それでもあなたは(+)(すなわち:TimeSeries<obj>)をサポートしていないタイプのTimeSeriesインスタンスを作成するために許可されますが、あなたは、あなたがそれを行うならば、あなたが買ってあげるとにかく、それらのインスタンスのための(+)を使用することはできませんコンパイル時にエラーメッセージが表示されます。

+0

素晴らしい!できます!どうもありがとう! –

関連する問題