Здравствуйте, D. Mon, Вы писали:
DM>Вот примерный аналог. Я заменил Clone на чуть более интересную функцию удвоения, которая число умножает на два, а строку повторяет два раза.
И зачем это потребовалось? Творчество не всегда дает положительный результат.
DM>DM>module TestModule = (* функтор - как бы шаблон, параметризованный нашим интерфейсом *)
DM> functor (Smthng: Doubleable) ->
DM> struct
DM> let test x = Smthng.double x
DM> end;;
DM>
Ну, и что мы выидим? В итоге ты воспользовался тем самым фанктором.
В коде на C# шаблонов не было и быть не могло, так как язык этого не поддерживает.
В вобщем, на мой взгляд, фанктор это все же ближе к интерфейсу, хотя прямой аналогии тут нет. Ну, а обобщенность — это уже скорее свойсво языка. Мы ведь и простую функцию можем сделать обобщенныой.
... << RSDN@Home 1.2.0 alpha rev. 637>>
DM>>Вот примерный аналог. Я заменил Clone на чуть более интересную функцию удвоения, которая число умножает на два, а строку повторяет два раза.
VD>И зачем это потребовалось?
Чтобы продемонстрировать применение функторов. Поскольку модули похожи на статические классы, клонировать там нечего.
Вообще, более близким аналогом твоего примера в Окамле будет
class a x =
object
val mutable _x = x
method clone = new a _x
end;;
let test c =
let copy = c#clone in
(*...use copy *)
();;
test(new a 123);;
test(new a "Test");;
(успешно компилируется, но ничего не выводит, результата не видно)
В Окамле есть и классы, и объекты, и интерфейсы, и наследование (в том числе множественное), и полиморфизм на уровне классов и функций. Только при переписывании твоего примера почти ничего из этого не понадобилось. На уровне модулей есть сигнатуры модулей — аналог интерфейсов, реализации модулей (структуры) — аналог классов, реализующих интерфейсы, и есть функторы, которые описываются как функции над модулями. И ближайший аналог им — генерики С# или шаблоны С++. Если интерфейс в С++/C# (сигнатура модулей в Окамле)- способ абстрагирования от реализации, то шаблоны/генерики в С++/C# (функторы в Окамле) — абстрагирование от типа. Причем как в C# есть конструкция where для уточнения типа-параметра, так и в Окамле можно его уточнить. Но уточнение (указание интерфейсов) в обоих языках требуется не всегда.
module TestModule = functor (Smthng: Doubleable) -> ...
это прямой аналог
static class TestModule <Smthng> where Smthng:Doubleable { ...