2010-09-09 11 views
5

trzeba zaimplementować statyczną metodę rozszerzenia wspiera ograniczeń członków na kilka podstawowych typów pierwotnych, takich jak liczby całkowite, pływaków, itd. Tu jest mój kodu dla podpisanych liczb:statyczne metody przedłużania wspierające ograniczenia członków

module MyOperators = 
    let inline foo (x : ^T) = (^T : (static member Foo : ^T -> int) (x)) 

    type System.Int32 with 
     static member Foo(x : Int32) = 7 // static extension 

kod Test:

open MyOperators  
let x = foo 5 // x should be 7 

Ale kompilator narzeka z powodu błędu:

The type 'System.Int32' does not support any operators named 'Foo'

W. Czego tu mi brakuje? Dzięki!

+0

Jeśli dobrze rozumiem cię, myślę, że nawet jeśli możesz to zrobić, nie jest to szczególnie dobry pomysł. Majstrowanie przy podstawowych mechanizmach językowych zawsze wydawało mi się anty-wzorcem. Pomyśl o tym, że ktoś oprócz Ciebie będzie musiał pracować nad tym kodem w pewnym momencie w przyszłości. Być może będziecie musieli nawet zachować ten kod w pewnym momencie w przyszłości, jeśli nie będziecie przez jakiś czas nad nim pracować. Modyfikacje typów wewnętrznych mogą prowadzić do kilku "WTF?" chwile. –

Odpowiedz

5

Więzy statyczne w F # nigdy nie znajdują "metod rozszerzenia", widzą tylko wewnętrzne metody typów (i kilka specjalnych przypadków wywoływanych w specyfikacji języka F #).

Być może zamiast tego można użyć metody przeciążania? Jaki jest twój ostateczny cel?

+0

Dzięki. Ostatecznym celem było dodanie własnego zestawu właściwości do FSharp.Core.Operators, takich jak funkcje trygonometryczne, itp. – Stringer

3

Ograniczenia statyczne typu F # nie działają z metodami rozszerzającymi. Metody rozszerzeń nie mogą być statycznie sprawdzane w czasie kompilacji, a mimo to możesz mieć wiele definicji dla Int32 :: Foo (w zależności od zaimportowanej przestrzeni nazw).

Niestety, aby rozwiązać problem, być może trzeba będzie skorzystać z refleksji.

+0

Ok Widzę, to brzmi nie bez powodu. Dzięki! – Stringer

+6

Nie sądzę, że jest to technicznie niewykonalne - metody rozszerzeń są sprawdzane statycznie w czasie kompilacji (kiedy je wywołujesz), więc mogą być również akceptowane przez ograniczenia członkowskie. Ma to sens, że nie jest to obsługiwane, ale powinno być możliwe ... –

+0

Dobra rozmowa, moja zła. –