Я смотрю OCaml's functors. Он выглядит очень похожим на так называемые общие объекты в C++
/C#
/Java
. Если вы проигнорируете стирание типа Java на данный момент и игнорируете детали реализации для шаблонов C++ (меня интересует языковая функция), функторы довольно специфичны для дженериков. Если я правильно понимаю, функтор дает вам новый набор функций от типа вы предоставляете, так что, напримерВ чем разница между функторами и «generics»
List<MyClass>.GetType() != List<MyOtherClass>.GetType()
Но можно грубо переписать в OCaml
#module Set =
functor (Elt: ORDERED_TYPE) ->
struct
type element = Elt.t
type set = element list
let empty = []
let rec add x s =
match s with
[] -> [x]
| hd::tl ->
match Elt.compare x hd with
Equal -> s (* x is already in s *)
| Less -> x :: s (* x is smaller than all elements of s *)
| Greater -> hd :: add x tl
let rec member x s =
match s with
[] -> false
| hd::tl ->
match Elt.compare x hd with
Equal -> true (* x belongs to s *)
| Less -> false (* x is smaller than all elements of s *)
| Greater -> member x tl
end;;
в C#
class Set<T> where T : ISortable
{
private List<T> l = new List<T>();
static public Set<T> empty = new Set<T>();
public bool IsMember(T x) {return l.IndexOf(x) > -1;}
public void Add(T x) {l.Add(x);}
}
Уверен, что существует немного другое, поскольку функтор влияет на Module
(это всего лишь куча типов функций и определений значений , аналогично пространству имен C#
).
Но разве это так? Являются ли функторы просто дженериками, применяемыми к пространствам имен? Или есть какие-то существенные различия между функторами и дженериками, которые мне не хватает.
Даже если функторы являются просто обобщенными для пространства имен, каково существенное преимущество этого подхода? Классы также могут использоваться как специальные пространства имен с использованием вложенных классов.
C++ и C# отличаются в аспекте системы типов? Я не вижу, как в нижней строке у вас есть новый тип списка, независимо от того, поддерживается ли он виртуальной машиной или автоматически создается во время компиляции. Познай меня. –
Добро пожаловать. описание модели класс X { T t; public: int hello() {return t.hello(); } }; класс Hello {public: int hello() {return 1; }}; int main() { X x; возвращение x.hello(); } –
ygrek
Возможно, я немного плотный, но я этого не понял. В вашем примере у вас есть класс Hello и класс типа X, как и в C#. Я подтвердил, что он печатает 1, как ожидалось, http://codepad.org/vZUPwFgs, какая разница в аспекте системы типов в примере, который вы дали (конечно, вы использовали не ссылочные типы, которые вы можете использовать только в C++, но кроме этого я не вижу разницы). –