Здравствуйте, VladD2, Вы писали:
V>>В этом смысле REPL банально удобнее, т.к. уже при установленном некоем окружении позволяет "играть" с ним.
VD>В отладчике можно вызвать функцию, поменять значения и даже изменить код программы. Этого более чем достаточно для отладки. А вот писать большую программу из репла — это утопия.
Отладчик сможет скомпилировать лямбду или макрос ? Крутой, значит, отладчик у Немерле.
Здравствуйте, vdimas, Вы писали:
V>Хм, итераторы GoF vs map/fold, или подача функтора в некий foreach для произвольного контейнера... не факт что тебе вообще следует так сильно настаивать на своём. Реально, в 2014-м сие смешно, попахивает 90-ми годами. Это минус 20 лет в карму C#, если ты будешь настаивать именно на своём способе решения. Хорошо, что в C# уже доступны и другие способы, например, реактивные либы набирают популярность.
Внезапно, в C# foreach может работать и с реактивной коллекцией.
Здравствуйте, vdimas, Вы писали:
V>Ты бы лучше ответил предметно там, где о подробностях речь. Я тебе предложил минимум пару вариантов, а ты испарился.
Я код просил, а не руками махание. Пока ни строчки не получил.
Здравствуйте, vdimas, Вы писали:
V>Покажешь как на генериках C# посчитать среднее арифметическое для первых 10 элементов типа System.Numerics.Complex?
using System;
using System.Collections.Generic;
using System.Numerics;
using System.Linq;
namespace DictionaryPassing
{
public interface CNum<T>
{
T Add(T a, T b);
T FromInt(int a);
}
public interface CReal<T> : CNum<T>
{
T Div(T a, T b);
}
public struct ComplexReal : CReal<Complex>
{
public Complex Div(Complex a, Complex b) { return a/b; }
public Complex Add(Complex a, Complex b) { return a+b; }
public Complex FromInt(int a) { return new Complex(a,0); }
}
static class Utils
{
public static T Avg<T, C>(this IEnumerable<T> xs) where C : CReal<T>, new()
{
var real = new C();
var sum = real.FromInt(0);
var i = 0;
foreach (var x in xs)
{
sum = real.Add(sum, x);
i++;
}
return real.Div(sum, real.FromInt(i));
}
}
class Program
{
static void Main(string[] args)
{
Console.WriteLine(Enumerable.Repeat(new Complex(1, 1), 100).Take(10).Avg<Complex,ComplexReal>());
}
}
}
'You may call it "nonsense" if you like, but I'VE heard nonsense, compared with which that would be as sensible as a dictionary!' (c) Lewis Carroll
Здравствуйте, Ikemefula, Вы писали:
I>>>Так давай сравним с C# последним. Задачу тебе дали. Какие проблемы ? Ты же намекаешь, что знаком с платформой неиздалека. Какие проблемы написать одну функцию, которая выдаст среднее арифметической для первых 10 элементов и будет универсальна для всех контейнеров.
V>>Покажешь как на генериках C# посчитать среднее арифметическое для первых 10 элементов типа System.Numerics.Complex?
I>Complex это число, в ём всего две компоненты, действительная и мнимая часть. А речь шла про контейнеры. I>если тебя смущает Complex, то для него перегружены операторы, ничего военнго в этом нет.
Ты поставил условие задачи? ОК. Я попросил сначала с тебя обобщенное её решение на генериках для произвольного контейнера. Заодно попросил проверить на аргументе-типе System.Numerics.Complex.
Здравствуйте, Klapaucius, Вы писали:
V>>Покажешь как на генериках C# посчитать среднее арифметическое для первых 10 элементов типа System.Numerics.Complex?
[известное еще в 2005-м году "решение" скипнуто]
Т.е. ни для типа int, ни для float, double, Complex твоё решение не работает, так?
Тут все заранее знали о чем речь, можно было не плодить YA ICalculator<T> или YA IArithmetic<T>, которым уже по 10 лет в обсуждениях на формах. ))
Я лишь демонстрирую оппонентам их демагогию. Тем более, в первоначальном условии попросили показать работоспособность на встроенном int.
Сразу было известно, что на генериках сие нерешаемо в общем виде для произвольных типов, имеющих переопределенные арифметические операторы.
Зато такая задача решается на шаблонах С++. Я лишь заметил оппонентам, что обобщенное программирование в Swift должно быть ближе к C++, чем к генерикам дотнета. Но они не поняли, похоже. Еще заметил, что для прохода по коллекции не нужны итераторы, если у нас имеется функциональный тип и некий метод коллекции foreach, принимающий функтор/делега в кач-ве аргумента. Этого они тоже не поняли. ))
Здравствуйте, vdimas, Вы писали:
V>Т.е. ни для типа int, ни для float, double, Complex твоё решение не работает, так?
Для Complex работает, для int, float, double пишете имплементации CReal и тоже работать будет.
V>Я лишь демонстрирую оппонентам их демагогию. Тем более, в первоначальном условии попросили показать работоспособность на встроенном int.
В чем демогогия? Какая проблема со "встроенным" int?
V>Сразу было известно, что на генериках сие нерешаемо в общем виде для произвольных типов, имеющих переопределенные арифметические операторы.
Наоборот, решаемо и обычно именно так как я показал и решается, в GHC-хаскеле, например.
V>Зато такая задача решается на шаблонах С++. Я лишь заметил оппонентам, что обобщенное программирование в Swift должно быть ближе к C++, чем к генерикам дотнета. Но они не поняли, похоже.
Как что-то хорошее.
V>Еще заметил, что для прохода по коллекции не нужны итераторы, если у нас имеется функциональный тип и некий метод коллекции foreach, принимающий функтор/делега в кач-ве аргумента. Этого они тоже не поняли. ))
В ленивом языке foldr == итератор, все возможности покрываются. В строгом это не так.
Вы давайте, не увиливайте, а решайте задачу D.Mon — я вашу решил.
'You may call it "nonsense" if you like, but I'VE heard nonsense, compared with which that would be as sensible as a dictionary!' (c) Lewis Carroll
Здравствуйте, vdimas, Вы писали:
DM>>Я код просил, а не руками махание. Пока ни строчки не получил. V>Ты пока попросил решение, такое же как где-то. Известная демагогия. Давай задачу целиком.
Здравствуйте, vdimas, Вы писали:
V>Я лишь демонстрирую оппонентам их демагогию. Тем более, в первоначальном условии попросили показать работоспособность на встроенном int. V>Сразу было известно, что на генериках сие нерешаемо в общем виде для произвольных типов, имеющих переопределенные арифметические операторы.
Ты сам развел демагогию. Вопрос был простейший, с интами. Приплетать комплексные числа и обобщать обобщуемое никто не просил.
Кроме того, мне эта задача интересна не в сравнении с C#, а в сравнении с другими современными языками. Если попросить Клапауция решить ее на хаскеле, он тоже скажет "на генериках сие нерешаемо"? Смешно же.
V>Зато такая задача решается на шаблонах С++. Я лишь заметил оппонентам, что обобщенное программирование в Swift должно быть ближе к C++, чем к генерикам дотнета. Но они не поняли, похоже. Еще заметил, что для прохода по коллекции не нужны итераторы, если у нас имеется функциональный тип и некий метод коллекции foreach, принимающий функтор/делега в кач-ве аргумента. Этого они тоже не поняли. ))
Да все мы поняли. Только того метода у свифтовых коллекций нет(?), поэтому это не решение, а словоблудие.
Здравствуйте, Klapaucius, Вы писали:
K>Здравствуйте, vdimas, Вы писали:
V>>Покажешь как на генериках C# посчитать среднее арифметическое для первых 10 элементов типа System.Numerics.Complex?
K>
K>
Ну ты и дал. А больше кода не мог нагнать ?
var items = new [] { new Complex(12, 6), дописать сколько надо, по желанию};
Console.Write(items.Take(10).Aggregate(new Complex(0,0), (acc,item) => acc + item));
Здравствуйте, Klapaucius, Вы писали:
I>>Ну ты и дал. А больше кода не мог нагнать ?
I>>
I>>var items = new [] { new Complex(12, 6), дописать сколько надо, по желанию};
I>>Console.Write(items.Take(10).Aggregate(new Complex(0,0), (acc,item) => acc + item));
I>>
K>Я понял его задачу (и, судя по всему, правильно) как написание обобщенного кода для вычисления среднего. У вас же код — не обобщенный.
Мы говорили про контейнеры. Так что смотрия где код не обобщенный. Ты можешь взять любой контейнер, даже реактивный, и пускануть этот же код. Более того, даже если ты напишешь свой контейнер, он сам собой заработает, что очевидно.
Здравствуйте, vdimas, Вы писали:
V>Тут все заранее знали о чем речь, можно было не плодить YA ICalculator<T> или YA IArithmetic<T>, которым уже по 10 лет в обсуждениях на формах. )) V>Я лишь демонстрирую оппонентам их демагогию. Тем более, в первоначальном условии попросили показать работоспособность на встроенном int.
В первоначальном условии было про контейнеры.
V>Зато такая задача решается на шаблонах С++. Я лишь заметил оппонентам, что обобщенное программирование в Swift должно быть ближе к C++, чем к генерикам дотнета. Но они не поняли, похоже. Еще заметил, что для прохода по коллекции не нужны итераторы, если у нас имеется функциональный тип и некий метод коллекции foreach, принимающий функтор/делега в кач-ве аргумента. Этого они тоже не поняли. ))
Все что надо знали и без тебя. Главное, что поняли, так это твою неспособность приводить код.
Здравствуйте, vdimas, Вы писали:
V>Ты поставил условие задачи? ОК. Я попросил сначала с тебя обобщенное её решение на генериках для произвольного контейнера. Заодно попросил проверить на аргументе-типе System.Numerics.Complex.
V>Думаю, ты этого не покажешь. Даже для int.
Я уже показал. Ты не забы, что речь про контейнеры ?
Либу в которой нет внятного дизайна контейнеров, не спасет даже самый лучший язык.
Здравствуйте, Ikemefula, Вы писали:
I>Мы говорили про контейнеры. Так что смотрия где код не обобщенный. Ты можешь взять любой контейнер, даже реактивный, и пускануть этот же код. Более того, даже если ты напишешь свой контейнер, он сам собой заработает, что очевидно.
Ну да, любой контейнер с Complex, а не любой контейнер с числами.
'You may call it "nonsense" if you like, but I'VE heard nonsense, compared with which that would be as sensible as a dictionary!' (c) Lewis Carroll
Здравствуйте, Klapaucius, Вы писали:
I>>Мы говорили про контейнеры. Так что смотрия где код не обобщенный. Ты можешь взять любой контейнер, даже реактивный, и пускануть этот же код. Более того, даже если ты напишешь свой контейнер, он сам собой заработает, что очевидно.
K>Ну да, любой контейнер с Complex, а не любой контейнер с числами.
В том то и дело, что речь шла про контейнеры, т.е. IEnumerable и тд. Товарищ просто не знал, как это сделано в Swift и решил перепрыгнуть на проблемы рантайма и другие, которые только ухитрился углядеть.
Здравствуйте, Ikemefula, Вы писали:
I>В том то и дело, что речь шла про контейнеры, т.е. IEnumerable и тд. Товарищ просто не знал, как это сделано в Swift и решил перепрыгнуть на проблемы рантайма и другие, которые только ухитрился углядеть.
Да я сразу понял, что он контратаковал на другом направлении. Какая разница, если все равно можно решение дать?
'You may call it "nonsense" if you like, but I'VE heard nonsense, compared with which that would be as sensible as a dictionary!' (c) Lewis Carroll
Здравствуйте, Ikemefula, Вы писали:
V>>Ты поставил условие задачи? ОК. Я попросил сначала с тебя обобщенное её решение на генериках для произвольного контейнера. Заодно попросил проверить на аргументе-типе System.Numerics.Complex.
V>>Думаю, ты этого не покажешь. Даже для int.
I>Я уже показал.
Где?
I>Ты не забы, что речь про контейнеры ?
Речь о чьей-то упертости, а не о контейнерах.
Вы настаиваете на итераторах GoF, а я настаиваю на принятом в функциональном виде способа обхода контейнера. С т.з. подхода итераторов — классика IoC.
Следуя нынешней моде вы в пролете. ))
I>Либу в которой нет внятного дизайна контейнеров, не спасет даже самый лучший язык.
А что первично, либа или язык? ))
Да и вообще, дизайн там достаточный, просто ты не понимаешь как им пользоваться. Шаблонное мышление-с.
Кароч. Мне надоела ваша упертость. Мне прям сейчас некогда ставить виртуалку с новой макосью и разворачивать там среду (на досуге поиграюсь с этим).
Вот тебе аналог контейнера из С++. Использованы только те ср-ва языка, аналоги которых есть в Swift, из описания языка и примеров.
template<T>
class MyContainer {
vector<T> items_;
public:
typedef function<bool(T&)> ForEachDelegate; // returns true to continue enumerationvoid foreach(ForEachDelegate d) {
for(auto i = items_.begin(); i != items_.end(); ++i)
if(!d(*i))
break;
}
};
Заметь, никакого дизайна контейнера нет. Есть лишь публичный foreach.
Мне расписывать далее решение исходного примера или уже стыдно? ))