[Nemerle] Генерики
От: _nn_ www.nemerleweb.com
Дата: 26.01.07 11:43
Оценка: +1
На C# такое не проходит, а хотелось бы.
class A<T>
{
  public static T add(T left, T right)
  {
    return left + right;
  }
}


Как можно провернуть это на Nemerle ?

P.S.
На мой взгляд нужно было бы в Nemerle починить баг .Net-а и добавить интерфейсы типа IAdd, IMultiply ..., а базовые типы наследовать от них.
Таким образом можно было бы писать:
class A[T] where T : IAdd
{
  public static add(left : T, right : T) : T
  {
    left + right;
  }
}


30.01.07 17:50: Перенесено модератором из 'Декларативное программирование' — IT
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re: [Nemerle] Генерики
От: deniok Россия  
Дата: 26.01.07 12:25
Оценка: +1
Здравствуйте, _nn_, Вы писали:


__>P.S.

__>На мой взгляд нужно было бы в Nemerle починить баг .Net-а и добавить интерфейсы типа IAdd, IMultiply ..., а базовые типы наследовать от них.

Возьмите сразу класс типа Num из Хаскелла и его наследников. Здесь
Автор: deniok
Дата: 22.01.07
. Влад хвалит
Автор: VladD2
Дата: 22.01.07
.
Re[2]: offtop - Num class
От: palm mute  
Дата: 26.01.07 12:35
Оценка: :))) :)
deniok wrote:

> Возьмите сразу класс типа Num из Хаскелла и его наследников. Влад

хвалит.
А хаскеллисты в кафе хаят:
Num is such a fat and greedy class
Им кольца и группы подавай.
Posted via RSDN NNTP Server 2.0
Re[3]: offtop - Num class
От: VladD2 Российская Империя www.nemerle.org
Дата: 26.01.07 13:19
Оценка:
Здравствуйте, palm mute, Вы писали:

>> Возьмите сразу класс типа Num из Хаскелла и его наследников. Влад

PM>хвалит.
PM>А хаскеллисты в кафе хаят:
PM><span class='lineQuote level1'>PM&gt;Num is such a fat and greedy class</span><br />
<span class='lineQuote level1'>PM&gt;</span>

PM>Им кольца и группы подавай.

Ну, к монадам конечно нужно что-то по извращеннее.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[4]: offtop - Num class
От: deniok Россия  
Дата: 26.01.07 14:10
Оценка:
Здравствуйте, VladD2, Вы писали:


VD>Ну, к монадам конечно нужно что-то по извращеннее.


Ты будешь смеяться, но есть Arrows, a generalization of monads. В стандартной библиотеке. Вот чё делается.
В том числе и Kleisli Arrow.
Re: [Nemerle] Генерики
От: ie Россия http://ziez.blogspot.com/
Дата: 26.01.07 17:04
Оценка:
Здравствуйте, _nn_, Вы писали:

__>Как можно провернуть это на Nemerle ?


Я как-то переписывался с Камилом по этому поводу, он обещал подумать. Но с тех пор так ничего и не сдвинулось. Пришли лишь к выводу, что вряд ли это возможно без поддержки со стороны компилятора.

__>P.S.

__>На мой взгляд нужно было бы в Nemerle починить баг .Net-а и добавить интерфейсы типа IAdd, IMultiply ..., а базовые типы наследовать от них.
__>Таким образом можно было бы писать:
__>
__>class A[T] where T : IAdd
__>{
__>  public static add(left : T, right : T) : T
__>  {
__>    left + right;
__>  }
__>}
__>


Хмм. Не совсем тебя понимаю. Ну есть тип int. Ну наследует IAdd, в котором есть метод Add. Такой код я еще понимаю:
    public static add(left : T, right : T) : T
    {
        left.Add(right);
    }


В общем тут не с интерфейсами играться надо, а с where кондишнами. Я предлагал банальный вариант:
    class A[T] where T : operator+
... << RSDN@Home 1.2.0 alpha rev. 655>>
Превратим окружающую нас среду в воскресенье.
Re[2]: [Nemerle] Генерики
От: _nn_ www.nemerleweb.com
Дата: 26.01.07 17:39
Оценка:
Здравствуйте, ie, Вы писали:

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


__>>Как можно провернуть это на Nemerle ?


ie>Я как-то переписывался с Камилом по этому поводу, он обещал подумать. Но с тех пор так ничего и не сдвинулось. Пришли лишь к выводу, что вряд ли это возможно без поддержки со стороны компилятора.


__>>P.S.

__>>На мой взгляд нужно было бы в Nemerle починить баг .Net-а и добавить интерфейсы типа IAdd, IMultiply ..., а базовые типы наследовать от них.
__>>Таким образом можно было бы писать:
__>>
__>>class A[T] where T : IAdd
__>>{
__>>  public static add(left : T, right : T) : T
__>>  {
__>>    left + right;
__>>  }
__>>}
__>>


ie>Хмм. Не совсем тебя понимаю. Ну есть тип int. Ну наследует IAdd, в котором есть метод Add. Такой код я еще понимаю:

ie>
ie>    public static add(left : T, right : T) : T
ie>    {
ie>        left.Add(right);
ie>    }
ie>


Имелось ввиду так.

ie>В общем тут не с интерфейсами играться надо, а с where кондишнами. Я предлагал банальный вариант:

ie>
ie>    class A[T] where T : operator+
ie>


Тоже вариант

Надо только иметь возможность определить возвращаемый тип типа:
class A[T] where T : operator+// default - (T, T) : T
class B[T] where T : operator+(T, int) : T
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[3]: [Nemerle] Генерики
От: ie Россия http://ziez.blogspot.com/
Дата: 26.01.07 17:43
Оценка:
Здравствуйте, _nn_, Вы писали:

__>Надо только иметь возможность определить возвращаемый тип типа:

__>
__>class A[T] where T : operator+// default - (T, T) : T
__>class B[T] where T : operator+(T, int) : T
__>


+1, но мне хотя бы дефолтноый случай
... << RSDN@Home 1.2.0 alpha rev. 655>>
Превратим окружающую нас среду в воскресенье.
Re: [Nemerle] Генерики
От: VladD2 Российская Империя www.nemerle.org
Дата: 26.01.07 18:02
Оценка:
Здравствуйте, _nn_, Вы писали:

__>На C# такое не проходит, а хотелось бы.

__>
__>class A<T>
__>{
__>  public static T add(T left, T right)
__>  {
__>    return left + right;
__>  }
__>}
__>


__>Как можно провернуть это на Nemerle ?


Так точно нельзя. Вместо этого можно объявить интерфейс:
using System.Console;

interface ISum[T]
{
  Add(x : T, y : T) : T;
}

class SumInt : ISum[int]
{
  public Add(x : int, y : int) : int { x + y }
}

class SumDouble : ISum[double]
{
  public Add(x : double, y : double) : double { x + y }
}

public module Program
{
  Test[T](sum : ISum[T], x : T, y : T) : void
  {
    WriteLine(sum.Add(x, y))
  }

  Main() : void
  { 
    Test(SumInt(), 1, 2);
    Test(SumDouble(), 1.1, 2.0);
  }
}


Но куда проще использовать функции высшего порядка.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[2]: [Nemerle] Генерики
От: _nn_ www.nemerleweb.com
Дата: 26.01.07 18:20
Оценка:
Здравствуйте, VladD2, Вы писали:

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


__>>На C# такое не проходит, а хотелось бы.

__>>
__>>class A<T>
__>>{
__>>  public static T add(T left, T right)
__>>  {
__>>    return left + right;
__>>  }
__>>}
__>>


__>>Как можно провернуть это на Nemerle ?


VD>Так точно нельзя. Вместо этого можно объявить интерфейс:

VD>
VD>using System.Console;

VD>interface ISum[T]
VD>{
VD>  Add(x : T, y : T) : T;
VD>}

VD>class SumInt : ISum[int]
VD>{
VD>  public Add(x : int, y : int) : int { x + y }
VD>}

VD>class SumDouble : ISum[double]
VD>{
VD>  public Add(x : double, y : double) : double { x + y }
VD>}

VD>public module Program
VD>{
VD>  Test[T](sum : ISum[T], x : T, y : T) : void
VD>  {
VD>    WriteLine(sum.Add(x, y))
VD>  }

VD>  Main() : void
VD>  { 
VD>    Test(SumInt(), 1, 2);
VD>    Test(SumDouble(), 1.1, 2.0);
VD>  }
VD>}
VD>


Это не решение все равно.
Для конкретного варианта может и подойдет, но изяществом и простотой не отличается.

VD>Но куда проще использовать функции высшего порядка.

Макрос который будет это все генерировать ?
А типы ему вручную задавать что ли ?
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[3]: [Nemerle] Генерики
От: VladD2 Российская Империя www.nemerle.org
Дата: 26.01.07 21:32
Оценка:
Здравствуйте, _nn_, Вы писали:

__>Это не решение все равно.

__>Для конкретного варианта может и подойдет, но изяществом и простотой не отличается.

Дык как раз в конкретных случаях это решение очень даже подходит. А вот заниматься фигней вроде обобщенных библиотек сложения — это конечно маразм.

VD>>Но куда проще использовать функции высшего порядка.

__>Макрос который будет это все генерировать ?
__>А типы ему вручную задавать что ли ?

Какие типы? Какие макросы?

Проблема в том, что ты думашь на С++. Вот и проблемы у тебя этого порядка.
В дотнете нет чего-то похожего на классы типов Хаскеля. Так что приделать интерфес извне нельзя.
Оданако в конкретных случаях прекрасно подходят фукнции высшего порядка. Абстрагируй свои алгоритмы с помощью фукнциональных объетов и все будет ОК.

Вот погляди на то как, например, реализуется обобщенная функция сортировки
Автор: VladD2
Дата: 22.01.07
.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[3]: [Nemerle] Генерики
От: VladD2 Российская Империя www.nemerle.org
Дата: 26.01.07 21:32
Оценка:
Просьба не оверквотить.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[4]: [Nemerle] Генерики
От: VladD2 Российская Империя www.nemerle.org
Дата: 26.01.07 21:32
Оценка:
Здравствуйте, ie, Вы писали:

__>>Надо только иметь возможность определить возвращаемый тип типа:

__>>
__>>class A[T] where T : operator+// default - (T, T) : T
__>>class B[T] where T : operator+(T, int) : T
__>>


ie>+1, но мне хотя бы дефолтноый случай


И какой IL это должно порождать. К тмоу же такие специализированные операторы — это верх кривизны.
В обще, это мышление на С++. Не более того. В дотнете это не прокатит. Такое только макросами или шаблонами сделать можно. Так как это не полиморфизм, а перегрузка.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[4]: [Nemerle] Генерики
От: _nn_ www.nemerleweb.com
Дата: 27.01.07 09:01
Оценка:
Здравствуйте, VladD2, Вы писали:

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


__>>Это не решение все равно.

__>>Для конкретного варианта может и подойдет, но изяществом и простотой не отличается.

VD>Дык как раз в конкретных случаях это решение очень даже подходит. А вот заниматься фигней вроде обобщенных библиотек сложения — это конечно маразм.


VD>>>Но куда проще использовать функции высшего порядка.

__>>Макрос который будет это все генерировать ?
__>>А типы ему вручную задавать что ли ?

VD>Какие типы? Какие макросы?


VD>Проблема в том, что ты думашь на С++. Вот и проблемы у тебя этого порядка.

А это здесь не при чем. Проблема с C#, а не с C++
VD>В дотнете нет чего-то похожего на классы типов Хаскеля. Так что приделать интерфес извне нельзя.
В этом и вопрос можно ли добавить такую функциональность через Nemerle ?

VD>Оданако в конкретных случаях прекрасно подходят фукнции высшего порядка. Абстрагируй свои алгоритмы с помощью фукнциональных объетов и все будет ОК.

VD>Вот погляди на то как, например, реализуется обобщенная функция сортировки
Автор: VladD2
Дата: 22.01.07
.
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[5]: [Nemerle] Генерики
От: VladD2 Российская Империя www.nemerle.org
Дата: 27.01.07 10:35
Оценка:
Здравствуйте, _nn_, Вы писали:

VD>>Проблема в том, что ты думашь на С++. Вот и проблемы у тебя этого порядка.

__>А это здесь не при чем. Проблема с C#, а не с C++

Проблема в обрезе мышления. Проблемы можно решать по разному. Можно тексутальными шаблонами, а можно декомпозицией функций. Дотнет не предоставляет первый подход, но позволяет использовать второй.

VD>>В дотнете нет чего-то похожего на классы типов Хаскеля. Так что приделать интерфес извне нельзя.

__>В этом и вопрос можно ли добавить такую функциональность через Nemerle ?

Систему типов дотнета изменить невозможно ни в каком языке. Можно толко попытаться содать внешнюю видимость. Примерно это делают шаблоны в С++. Но такое решение противоречит самому духу дотнета. Ведь написанные с использованием шаблонов функции будут доступны только в виде исходников, так как факрически для любого сочетания типов компилятору прийдется создавать перегруженный вариант фукнции (тупо дублировать код). Это решение принципиально не совместимо с динамикой присущей дотенту.

Красивым решением было бы использовать идею "внешних интерфейсов" которые в Хаскеле были называны классами типов. Но боюсь, что без поддержки со стороны рантайма это невозможно. Хотя тут по уму нужно проводить отдельное исследование.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[6]: [Nemerle] Генерики
От: _nn_ www.nemerleweb.com
Дата: 27.01.07 11:48
Оценка:
Здравствуйте, VladD2, Вы писали:

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


VD>>>Проблема в том, что ты думашь на С++. Вот и проблемы у тебя этого порядка.

__>>А это здесь не при чем. Проблема с C#, а не с C++

VD>Проблема в обрезе мышления. Проблемы можно решать по разному. Можно тексутальными шаблонами, а можно декомпозицией функций. Дотнет не предоставляет первый подход, но позволяет использовать второй.


Я не отрицаю, что можно решить эту задачу и другими способами. но хочется чтобы и первый вариант был возможен.
.
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[6]: [Nemerle] Генерики
От: Alexey Romanov  
Дата: 27.01.07 16:11
Оценка:
Здравствуйте, VladD2, Вы писали:

Лишнее цитирование удалено.

VD>Красивым решением было бы использовать идею "внешних интерфейсов" которые в Хаскеле были называны классами типов. Но боюсь, что без поддержки со стороны рантайма это невозможно. Хотя тут по уму нужно проводить отдельное исследование.


Без поддержки со стороны рантайма можно, без поддержки компилятора -- нет. Вариант на Java: JavaGI: Generalized Interfaces for Java. Макросов Nemerle на это не хватает.
Re[7]: [Nemerle] Генерики
От: VladD2 Российская Империя www.nemerle.org
Дата: 27.01.07 16:25
Оценка:
Удаляйне лишнее цитирование!
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[7]: [Nemerle] Генерики
От: VladD2 Российская Империя www.nemerle.org
Дата: 27.01.07 16:43
Оценка:
Здравствуйте, Alexey Romanov, Вы писали:

AR>Без поддержки со стороны рантайма можно, без поддержки компилятора -- нет. Вариант на Java: JavaGI: Generalized Interfaces for Java. Макросов Nemerle на это не хватает.


Надо изучать. Боюсь, все же, что это решение будет конфликтовать с динамикой.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[7]: [Nemerle] Генерики
От: VladD2 Российская Империя www.nemerle.org
Дата: 27.01.07 16:50
Оценка:
Здравствуйте, Alexey Romanov, Вы писали:

AR>Без поддержки со стороны рантайма можно, без поддержки компилятора -- нет. Вариант на Java: JavaGI: Generalized Interfaces for Java. Макросов Nemerle на это не хватает.


http://groups.google.com/group/nemerle-en/browse_thread/thread/542c386aa18bf61d
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.