Re[4]: Можно ли полностью отказаться от динамически типизиро
От: FR  
Дата: 19.11.10 06:02
Оценка: +1
Здравствуйте, hardcase, Вы писали:


H>Круто А для чего это можно использовать?


Ну в одном из прародителей Немерле — OCaml все записи и объекты структурно типизированы и
соответственно функции работающие с ними обобщенные без всяких генериков или шаблонов.
Re[5]: Можно ли полностью отказаться от динамически типизиро
От: hardcase Пират http://nemerle.org
Дата: 19.11.10 11:11
Оценка: +1
Здравствуйте, FR, Вы писали:

FR>Здравствуйте, hardcase, Вы писали:



H>>Круто А для чего это можно использовать?


FR>Ну в одном из прародителей Немерле — OCaml все записи и объекты структурно типизированы и

FR>соответственно функции работающие с ними обобщенные без всяких генериков или шаблонов.

Это понятно. Проблема лишь в том, что система типов .NET (как и JVM) не слишком подходит для реализации структурной типизации, которая, как я понял, мощнее чем классическое ООП.
/* иЗвиНите зА неРовнЫй поЧерК */
Re[5]: Можно ли полностью отказаться от динамически типизиро
От: nikov США http://www.linkedin.com/in/nikov
Дата: 19.11.10 16:41
Оценка:
Здравствуйте, FR, Вы писали:

FR>Ну в одном из прародителей Немерле — OCaml все записи и объекты структурно типизированы и

FR>соответственно функции работающие с ними обобщенные без всяких генериков или шаблонов.

А каким образом структурные типы позволяют заменить дженерики? Как там можно абстрагироваться от какого-нибудь конкретного типа в сигнатуре?
Re[6]: Можно ли полностью отказаться от динамически типизиро
От: nikov США http://www.linkedin.com/in/nikov
Дата: 19.11.10 16:46
Оценка:
Здравствуйте, hardcase, Вы писали:

H>Это понятно. Проблема лишь в том, что система типов .NET (как и JVM) не слишком подходит для реализации структурной типизации


Возможно такое же решение, как для dynamic в DLR: reflection + runtime codegen + кеширование. Да, некоторое замедление будет. Но в некоторых сценариях удобство перевешивает. И уж подавно во многих сценариях structural типы могли бы потеснить dynamic.
Re[6]: Можно ли полностью отказаться от динамически типизиро
От: D. Mon Великобритания http://thedeemon.livejournal.com
Дата: 19.11.10 16:59
Оценка: +1
Здравствуйте, nikov, Вы писали:

FR>>Ну в одном из прародителей Немерле — OCaml все записи и объекты структурно типизированы и

FR>>соответственно функции работающие с ними обобщенные без всяких генериков или шаблонов.

N>А каким образом структурные типы позволяют заменить дженерики? Как там можно абстрагироваться от какого-нибудь конкретного типа в сигнатуре?


Там абстрагирование не от "какого-нибудь конкретного типа", а более широкое — от неиспользуемых деталей. Например, если у объектов разных типов есть какие-то одинаковые методы, то можно с ними одинаково работать без объявления отдельного интерфейса, при том что типы тех объектов различны.
Re[7]: Можно ли полностью отказаться от динамически типизиро
От: nikov США http://www.linkedin.com/in/nikov
Дата: 19.11.10 17:30
Оценка:
Здравствуйте, 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]: Можно ли полностью отказаться от динамически типизиро
От: D. Mon Великобритания http://thedeemon.livejournal.com
Дата: 19.11.10 18:28
Оценка: +1
Здравствуйте, nikov, Вы писали:

N>А как это решается со structural типами без дженериков?


Это просто разные задачи, одно другое не заменяет. Речь про то, что грубо говоря x.foo + x.bar будет работать для любых структур, имеющих подходящие foo и bar, какие бы другие поля там ни были. Абстрагируемся не от типа конкретного поля, а от типов всех неупомянутых полей.
А то, что делают генерики, в Окамле делают параметры типов.
Re[6]: Можно ли полностью отказаться от динамически типизиро
От: FR  
Дата: 19.11.10 19:21
Оценка:
Здравствуйте, nikov, Вы писали:


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]: Можно ли полностью отказаться от динамически типизиро
От: nikov США http://www.linkedin.com/in/nikov
Дата: 19.11.10 20:20
Оценка:
Здравствуйте, FR, Вы писали:

FR>o1 и o2 анонимные и никак ни связанные друг с другом объекты. Функция put может работать с любым объектом имеющим метод

FR>put с подходящей сигнатурой. Тип у этой функции обобщенный: value put : < put : 'a; .. > -> 'a = <fun>

Очень интересно. То есть структурный тип автоматически выводится из того, какие методы с какими параметрами мы вызвали, и максимально генерализуется?

А что будет, если я напишу так?
let put o = o#put o
Re[6]: Можно ли полностью отказаться от динамически типизиро
От: VladD2 Российская Империя www.nemerle.org
Дата: 19.11.10 21:08
Оценка:
Здравствуйте, hardcase, Вы писали:

H>Как человек, который поддерживет хренову тучу кода на Nemerle я готов побить авторов креативов, в которых на протяжении пары-тройки моих не самых маленьких экранов может не встречается ни одной аннотации типов.

H>Так что все хорошо в меру.

Это все потому что интерграция не работает с компилятором. Если поддержка IDE есть, то проблем нет.

Я вот по "просьбам скрипящих" третий день занимаюсь поддержкой реализации разных воплощений одного интерфейса в одном типе. Так вот, я просто скопировал методы что меняю в новый проект. Воспроизвел окружение (скопипэстил используемые приватные поля) и работаю себе сипокойнинько.

В общем, с IDE — полет нормальный. Без нее конечно иногда трудновато бывает. Особенно когда имена переменных и функций в стиле add_sr встречаются.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[5]: Можно ли полностью отказаться от динамически типизиро
От: VladD2 Российская Империя www.nemerle.org
Дата: 19.11.10 21:16
Оценка:
Здравствуйте, FR, Вы писали:

FR>Ну в одном из прародителей Немерле — OCaml все записи и объекты структурно типизированы и

FR>соответственно функции работающие с ними обобщенные без всяких генериков или шаблонов.

В немерле их тен только потому, что система типов дотнета для этого плохо подходит. В прочем с генерацией промежуточных оберток это возможно. Более того уже есть реализация на макросах — ObjectExpressions.

Так что "Никогда не говори никогда!".
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[7]: Можно ли полностью отказаться от динамически типизиро
От: VladD2 Российская Империя www.nemerle.org
Дата: 19.11.10 21:17
Оценка: +1
Здравствуйте, nikov, Вы писали:

N>Возможно такое же решение, как для dynamic в DLR: reflection + runtime codegen + кеширование. Да, некоторое замедление будет. Но в некоторых сценариях удобство перевешивает. И уж подавно во многих сценариях structural типы могли бы потеснить dynamic.


Мне кажется что такие вещи нужно на уровне рантайма реализовывать. Тогда и "замедления" (что в у простого народа тормозами зовется) не было бы.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[8]: Можно ли полностью отказаться от динамически типизиро
От: VladD2 Российская Империя www.nemerle.org
Дата: 19.11.10 21:21
Оценка: +1
Здравствуйте, nikov, Вы писали:

N>Очень интересно. То есть структурный тип автоматически выводится из того, какие методы с какими параметрами мы вызвали, и максимально генерализуется?


ОКамл выводит наиболее общий тип, если не ошибаюсь.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[8]: Можно ли полностью отказаться от динамически типизиро
От: FR  
Дата: 20.11.10 04:29
Оценка: 17 (1)
Здравствуйте, 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]: Можно ли полностью отказаться от динамически типизиро
От: FR  
Дата: 20.11.10 04:36
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>В немерле их тен только потому, что система типов дотнета для этого плохо подходит. В прочем с генерацией промежуточных оберток это возможно. Более того уже есть реализация на макросах — ObjectExpressions.


Влад, поворчу, у вас с WolfHound вырабаталась дурная привычка давать ссылки уже даже не на исходники а в дебри svn.
Мне вот влом с таким разбираться и 99% тем кто не знает немерли наверняка также.
Но я потыкал и ничего кроме инициализации объектов похожей на на окамловские записи не увидел.

VD>Так что "Никогда не говори никогда!".


Ну тут как раз тот случай когда можно, без поддержки рантайма толку от структурных типов мало.
Re[7]: Можно ли полностью отказаться от динамически типизиро
От: VladD2 Российская Империя www.nemerle.org
Дата: 21.11.10 02:16
Оценка:
Здравствуйте, FR, Вы писали:

VD>>В немерле их тен только потому, что система типов дотнета для этого плохо подходит. В прочем с генерацией промежуточных оберток это возможно. Более того уже есть реализация на макросах — ObjectExpressions.


FR>Влад, поворчу, у вас с WolfHound вырабаталась дурная привычка давать ссылки уже даже не на исходники а в дебри svn.

FR>Мне вот влом с таким разбираться и 99% тем кто не знает немерли наверняка также.

Вообще-то там мелкий проект и его тесты. ОК, буду сразу давать ссылки на тесты.

FR>Но я потыкал и ничего кроме инициализации объектов похожей на на окамловские записи не увидел.


Там макрос позволяющий по месту объявить реализацию интерфейса или абстрактного класса. Это конечно не тоже самое, но проблему отсутствия реализации интерфейса решает.

VD>>Так что "Никогда не говори никогда!".


FR>Ну тут как раз тот случай когда можно, без поддержки рантайма толку от структурных типов мало.


Ну, почему же? Эмулировать поведение конечно можно. Но будет некоторый рантайм оверхэд, которого можно было бы легко избежать при реализации рантаймом.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[8]: Можно ли полностью отказаться от динамически типизиро
От: FR  
Дата: 21.11.10 06:19
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Вообще-то там мелкий проект и его тесты. ОК, буду сразу давать ссылки на тесты.


Я их смотрел, http://code.google.com/p/nemerle/source/browse/nemerle/trunk/snippets/ObjectExpressions/ObjectExpressionsTest/Main.n
мало что понятно.

FR>>Но я потыкал и ничего кроме инициализации объектов похожей на на окамловские записи не увидел.


VD>Там макрос позволяющий по месту объявить реализацию интерфейса или абстрактного класса. Это конечно не тоже самое, но проблему отсутствия реализации интерфейса решает.


Ну это вообще никакого отношения к теме не имеет.

FR>>Ну тут как раз тот случай когда можно, без поддержки рантайма толку от структурных типов мало.


VD>Ну, почему же? Эмулировать поведение конечно можно. Но будет некоторый рантайм оверхэд, которого можно было бы легко избежать при реализации рантаймом.


Можно, но это не тривиальная вещь.
В том же F# отказались.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.