2012-12-24 16 views
8

statik olarak çözülmüş türler Kendi sınıfımda IEnumerable<KeyValuePair<DateTime, 'T>> uygulamak ve operatörlere 'T sayısal türlerinde satır içi işlev gibi çalışacak şekilde matematik işleçleri eklemek istiyorum - otomatik olarak kısıtlamalar ekleyin.f # Tür üyelerinde

Aşağıdaki kod çalışmasını yapamıyorum. Üye beyannamede ne 'inline' anahtar kelimesi ne de 'inline' anahtar sözcüğü ile çalışmaz. Ayrıca

I. tipteki önce fonksiyonunu

let inline add l r = l + r 

tanımlar ve ekleme l.Value + r.Value yerine kullanılırsa, o da çalışmaz.

Birisi bana yanlış yaptığımı gösterebilir mi?

Muhtemelen bütün yaklaşım yanlıştır ve aynı hedefe ulaşmak için başka bir yol var mıdır?

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

İşte bildiğim soruya en basit cevap: http://tomasp.net/blog/fsharp-generic-numeric.aspx Karmaşık konu. –

cevap

6

Yaklaşımınız bana uygun görünüyor. Kodunuzun derlenmemesinin nedeni, F # türü çıkarımının, tür tanımı için kullanılan ile aynı olan 'T tür değişkeni için statik bir kısıtlama (derleme zamanı) almasıdır.

bir tip tanımının genel bir parametre statik (hayır "şapka" türleri) çözülemeyen ama hiçbir şey bir işlev ya da bu derleme zamanı kısıtlamaları kullanan bir üye tanımlama alıkoyar.

'T tür değişkeni için (+) tanım numaralı statik değerindeki değişkeni değiştirin ve iyi olacaktır.

Hala (+) desteklemeyen bir tip (yani: TimeSeries<obj>) bir TimeSeries örneğini oluşturmasına izin olacağım ama sen bunu zaten eğer alırsınız, bu örnekleri için (+) kullanmak mümkün olmayacaktır derleme zamanında güzel bir hata mesajı.

+0

Harika! İşe yarıyor! Çok teşekkürler! –