Re[23]: Ищется язык
От: VladD2 Российская Империя www.nemerle.org
Дата: 29.12.07 11:19
Оценка:
Здравствуйте, 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>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[24]: Ищется язык
От: D. Mon Великобритания http://thedeemon.livejournal.com
Дата: 29.12.07 14:47
Оценка:
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 { ...
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.