Ну в одном из прародителей Немерле — OCaml все записи и объекты структурно типизированы и
соответственно функции работающие с ними обобщенные без всяких генериков или шаблонов.
Re[5]: Можно ли полностью отказаться от динамически типизиро
Здравствуйте, FR, Вы писали:
FR>Здравствуйте, hardcase, Вы писали:
H>>Круто А для чего это можно использовать?
FR>Ну в одном из прародителей Немерле — OCaml все записи и объекты структурно типизированы и FR>соответственно функции работающие с ними обобщенные без всяких генериков или шаблонов.
Это понятно. Проблема лишь в том, что система типов .NET (как и JVM) не слишком подходит для реализации структурной типизации, которая, как я понял, мощнее чем классическое ООП.
/* иЗвиНите зА неРовнЫй поЧерК */
Re[5]: Можно ли полностью отказаться от динамически типизиро
Здравствуйте, FR, Вы писали:
FR>Ну в одном из прародителей Немерле — OCaml все записи и объекты структурно типизированы и FR>соответственно функции работающие с ними обобщенные без всяких генериков или шаблонов.
А каким образом структурные типы позволяют заменить дженерики? Как там можно абстрагироваться от какого-нибудь конкретного типа в сигнатуре?
Re[6]: Можно ли полностью отказаться от динамически типизиро
Здравствуйте, hardcase, Вы писали:
H>Это понятно. Проблема лишь в том, что система типов .NET (как и JVM) не слишком подходит для реализации структурной типизации
Возможно такое же решение, как для dynamic в DLR: reflection + runtime codegen + кеширование. Да, некоторое замедление будет. Но в некоторых сценариях удобство перевешивает. И уж подавно во многих сценариях structural типы могли бы потеснить dynamic.
Re[6]: Можно ли полностью отказаться от динамически типизиро
Здравствуйте, nikov, Вы писали:
FR>>Ну в одном из прародителей Немерле — OCaml все записи и объекты структурно типизированы и FR>>соответственно функции работающие с ними обобщенные без всяких генериков или шаблонов.
N>А каким образом структурные типы позволяют заменить дженерики? Как там можно абстрагироваться от какого-нибудь конкретного типа в сигнатуре?
Там абстрагирование не от "какого-нибудь конкретного типа", а более широкое — от неиспользуемых деталей. Например, если у объектов разных типов есть какие-то одинаковые методы, то можно с ними одинаково работать без объявления отдельного интерфейса, при том что типы тех объектов различны.
Re[7]: Можно ли полностью отказаться от динамически типизиро
Здравствуйте, D. Mon, Вы писали:
DM>Там абстрагирование не от "какого-нибудь конкретного типа", а более широкое — от неиспользуемых деталей. Например, если у объектов разных типов есть какие-то одинаковые методы, то можно с ними одинаково работать без объявления отдельного интерфейса, при том что типы тех объектов различны.
Вот именно, что дженерики позволяют обобщенно работать с методами, которые могут быть не совсем одинаковы.
interface IConverter<T>
{
T Convert(T x);
}
class IntConverter : IConverter<int>
{
public int Convert(int x)
{
return x * 2;
}
}
class StringConverter : IConverter<string>
{
public string Convert(string x)
{
return x.ToUpper();
}
}
static void Foo<T>(IConverter<T> conv, T x)
{
T y = conv.Convert(x); // здесь может быть вызван и IntConverter.Convert(int), и StringConverter.Convert(string)
}
А как это решается со structural типами без дженериков?
Re[8]: Можно ли полностью отказаться от динамически типизиро
Здравствуйте, nikov, Вы писали:
N>А как это решается со structural типами без дженериков?
Это просто разные задачи, одно другое не заменяет. Речь про то, что грубо говоря x.foo + x.bar будет работать для любых структур, имеющих подходящие foo и bar, какие бы другие поля там ни были. Абстрагируемся не от типа конкретного поля, а от типов всех неупомянутых полей.
А то, что делают генерики, в Окамле делают параметры типов.
Re[6]: Можно ли полностью отказаться от динамически типизиро
N>А каким образом структурные типы позволяют заменить дженерики? Как там можно абстрагироваться от какого-нибудь конкретного типа в сигнатуре?
Функции принимающие структурный тип автоматически становятся обобщенными, то есть принимают любой структурный тип имеющий нужные
для данной функции сигнатуры, вот простейшие пример на объектах:
open Printf
let o1 = object
method put = printf "O1\n"end
let o2 = object
method put = printf "O2\n"end
let put o = o#put
let _ = put o1
let _ = put o2
o1 и o2 анонимные и никак ни связанные друг с другом объекты. Функция put может работать с любым объектом имеющим метод
put с подходящей сигнатурой. Тип у этой функции обобщенный: value put : < put : 'a; .. > -> 'a = <fun>
Re[7]: Можно ли полностью отказаться от динамически типизиро
Здравствуйте, FR, Вы писали:
FR>o1 и o2 анонимные и никак ни связанные друг с другом объекты. Функция put может работать с любым объектом имеющим метод FR>put с подходящей сигнатурой. Тип у этой функции обобщенный: value put : < put : 'a; .. > -> 'a = <fun>
Очень интересно. То есть структурный тип автоматически выводится из того, какие методы с какими параметрами мы вызвали, и максимально генерализуется?
А что будет, если я напишу так?
let put o = o#put o
Re[6]: Можно ли полностью отказаться от динамически типизиро
Здравствуйте, hardcase, Вы писали:
H>Как человек, который поддерживет хренову тучу кода на Nemerle я готов побить авторов креативов, в которых на протяжении пары-тройки моих не самых маленьких экранов может не встречается ни одной аннотации типов. H>Так что все хорошо в меру.
Это все потому что интерграция не работает с компилятором. Если поддержка IDE есть, то проблем нет.
Я вот по "просьбам скрипящих" третий день занимаюсь поддержкой реализации разных воплощений одного интерфейса в одном типе. Так вот, я просто скопировал методы что меняю в новый проект. Воспроизвел окружение (скопипэстил используемые приватные поля) и работаю себе сипокойнинько.
В общем, с IDE — полет нормальный. Без нее конечно иногда трудновато бывает. Особенно когда имена переменных и функций в стиле add_sr встречаются.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[5]: Можно ли полностью отказаться от динамически типизиро
Здравствуйте, FR, Вы писали:
FR>Ну в одном из прародителей Немерле — OCaml все записи и объекты структурно типизированы и FR>соответственно функции работающие с ними обобщенные без всяких генериков или шаблонов.
В немерле их тен только потому, что система типов дотнета для этого плохо подходит. В прочем с генерацией промежуточных оберток это возможно. Более того уже есть реализация на макросах — ObjectExpressions.
Так что "Никогда не говори никогда!".
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[7]: Можно ли полностью отказаться от динамически типизиро
Здравствуйте, nikov, Вы писали:
N>Возможно такое же решение, как для dynamic в DLR: reflection + runtime codegen + кеширование. Да, некоторое замедление будет. Но в некоторых сценариях удобство перевешивает. И уж подавно во многих сценариях structural типы могли бы потеснить dynamic.
Мне кажется что такие вещи нужно на уровне рантайма реализовывать. Тогда и "замедления" (что в у простого народа тормозами зовется) не было бы.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[8]: Можно ли полностью отказаться от динамически типизиро
Здравствуйте, nikov, Вы писали:
N>Очень интересно. То есть структурный тип автоматически выводится из того, какие методы с какими параметрами мы вызвали, и максимально генерализуется?
ОКамл выводит наиболее общий тип, если не ошибаюсь.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[8]: Можно ли полностью отказаться от динамически типизиро
Здравствуйте, nikov, Вы писали:
N>Очень интересно. То есть структурный тип автоматически выводится из того, какие методы с какими параметрами мы вызвали, и максимально генерализуется?
Да.
N>А что будет, если я напишу так? N>
N>let put o = o#put o
N>
Если не меняя ничего больше, то будет ошибка на первом применении функции put то есть на строке let _ = put o1
Error: This expression has type < put : unit >
but an expression was expected of type < put : 'a -> 'b; .. > as 'a
Types for method put are incompatible
Если же к методам добавить параметр
method put x = printf "O2\n"
то все нормально откомпилируется и запустится.
В общем в отличии от динамики вся типизация работает.
Re[6]: Можно ли полностью отказаться от динамически типизиро
Здравствуйте, VladD2, Вы писали:
VD>В немерле их тен только потому, что система типов дотнета для этого плохо подходит. В прочем с генерацией промежуточных оберток это возможно. Более того уже есть реализация на макросах — ObjectExpressions.
Влад, поворчу, у вас с WolfHound вырабаталась дурная привычка давать ссылки уже даже не на исходники а в дебри svn.
Мне вот влом с таким разбираться и 99% тем кто не знает немерли наверняка также.
Но я потыкал и ничего кроме инициализации объектов похожей на на окамловские записи не увидел.
VD>Так что "Никогда не говори никогда!".
Ну тут как раз тот случай когда можно, без поддержки рантайма толку от структурных типов мало.
Re[7]: Можно ли полностью отказаться от динамически типизиро
Здравствуйте, FR, Вы писали:
VD>>В немерле их тен только потому, что система типов дотнета для этого плохо подходит. В прочем с генерацией промежуточных оберток это возможно. Более того уже есть реализация на макросах — ObjectExpressions.
FR>Влад, поворчу, у вас с WolfHound вырабаталась дурная привычка давать ссылки уже даже не на исходники а в дебри svn. FR>Мне вот влом с таким разбираться и 99% тем кто не знает немерли наверняка также.
Вообще-то там мелкий проект и его тесты. ОК, буду сразу давать ссылки на тесты.
FR>Но я потыкал и ничего кроме инициализации объектов похожей на на окамловские записи не увидел.
Там макрос позволяющий по месту объявить реализацию интерфейса или абстрактного класса. Это конечно не тоже самое, но проблему отсутствия реализации интерфейса решает.
VD>>Так что "Никогда не говори никогда!".
FR>Ну тут как раз тот случай когда можно, без поддержки рантайма толку от структурных типов мало.
Ну, почему же? Эмулировать поведение конечно можно. Но будет некоторый рантайм оверхэд, которого можно было бы легко избежать при реализации рантаймом.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[8]: Можно ли полностью отказаться от динамически типизиро
Ну это вообще никакого отношения к теме не имеет.
FR>>Ну тут как раз тот случай когда можно, без поддержки рантайма толку от структурных типов мало.
VD>Ну, почему же? Эмулировать поведение конечно можно. Но будет некоторый рантайм оверхэд, которого можно было бы легко избежать при реализации рантаймом.
Можно, но это не тривиальная вещь.
В том же F# отказались.