Oto kilka uwag na temat technicznych różnic.
Moduły mogą być "otwarte" pod (chyba że mają RequireQualifiedAccessAttribute). Oznacza to, że jeśli umieścić funkcje (F
i G
) w module (M
), to można napisać
open M
... F x ... G x ...
natomiast z metodą statyczną, można zawsze napisać
... M.F x ... M.G x ...
Module funkcje nie mogą być przeciążone. Funkcje w module są dozwolone, a funkcje let-bound nie zezwalają na przeciążanie. Jeśli chcesz być w stanie wywołać zarówno
X.F(someInt)
X.F(someInt, someString)
należy użyć member
s o rodzaju, które działa tylko z „kwalifikowanych” rozmowy (np type.StaticMember(...)
lub object.InstanceMember(...)
).
(Czy są jakieś inne różnice? Nie mogę sobie przypomnieć.)
To są główne różnice techniczne, które wpływają na wybór jednego nad drugim.
Ponadto istnieje pewna tendencja w środowisku wykonawczym F # (FSharp.Core.dll) do korzystania z modułów tylko dla typów F # (które zwykle nie są używane podczas wykonywania współdziałania z innymi językami .Net) i metod statycznych dla interfejsów API które są bardziej neutralne językowo. Na przykład wszystkie funkcje z parametrami curry pojawiają się w modułach (funkcje curry nie są trywialne, aby wywołać je z innych języków).
+1. Ostatni akapit to dobry punkt! –
_ "(Czy istnieją inne różnice? Nie pamiętam.)", Pozwól mi spróbować: (1) Wytyczne F # nazywania wymagają statycznego członka klasy, aby rozpocząć od kapitału, modułu let-binding z małą literą; (2) typy mogą być rozszerzone (użyj składni 'z'), moduły nie mogą (niestety tak); (3) statyczne elementy typu są zwykle inicjowane po pierwszym dostępie do typu, wiązanie let modułu jest inicjowane znacznie wcześniej, często, gdy powiązany typ w tym samym zestawie jest dostępny (jest to przede wszystkim ważne dla członków lub powiązań, które nie są funkcjami) . – Abel
I podobieństwo: (4) statyczne elementy nie mogą być przeciążone ani przy użyciu składni funkcji w stylu F # ('statyczny element x a b' nie może być przeciążony,' statyczny element x (a, b) 'może). Ma to tę zaletę, że statyczne elementy mogą być również wykorzystywane w curry, ale mają tę wadę, że stają się trudniejsze do wywołania z C# itd. – Abel