Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[44.200.169.48] |
|
Страницы: (4) « Первая ... 2 3 [4] все ( Перейти к последнему сообщению ) |
Сообщ.
#46
,
|
|
|
Новичок!
- Да учитель? Учитель Зови меня Коуч - Ок Коуч - А кто это пардон? неважно Короче студент пока ты спал я тут немного код поменял в посте #45. Заменил TComparison<T> на TEqualityComparison<T> ибо TComparison возвращал integer, а нам надо boolean что приводило к лишним проверкам. - О Коуч так действительно более логично - У меня вопрос Какой? - Что такое чистые функции? Вы вначале писали. Чистыми называют те функции, которые что-то получают и что-то возвращяют, при этом они не должны изменять какие-то внешние состояния. - Примерчик можно? Да вот например пример чистой анонимной функции: function (s: string): integer begin Result:= Length(s); end она пулучает строку, а возвращает число, ее результат полнойстью зависит от параметра и всегда возращает одно и тоже значение для одного и того же агрумента. При это в теле функции нет обращений к глобальным переменным или функциям, которые бы были не чистыми. Length тоже чистая функция, поскольку получает строку и возвращает ее длину, я просто обернул ее в анонимку - Угу а почему они так важны в функционльном програмировании? По причине что не меняют внешнее состояние, что как я уже говорил является первм условием функциональной парадигмы. Кроме того чистые функции легко тестировать. - А пример грязной функции Ну вот например пример function(i: integer): integer begin Result:= Random(i); end Хотя она принимает один аргумент и возвращает значение, в ней есть вызов грязной функции Random, которая каждый раз возвращает разные значения для одного и того же аргумента. Или вот еще пример var i:= 100; function: integer begin Result:= Inc(i); end Тут мы имеем дело с изменением внешней переменной. - Понятно Коуч! - Еще вопрос... я тут пытался понять как читать вызовы методов Spring, но тщетно не могли бы вы объяснить как их читать? Новичок, я сам до недавнего времени разбирался как их читать |
Сообщ.
#47
,
|
|
|
- Коуч, при всем уважении, но я думаю что лучше удалять прямо из списка sts
strs.Remove('banana'); Да Новичок ты прав! Черт побери! При всех преимуществах функционального подхода, не стоит игнорировать императивный стиль, ибо в конце концов нам придеться взаимодействовать с гуем например, чтобы изменять состояние в разных его окошках. В данном случае чтоб удалить банан естественно надо юзать Remove, при условии конешно, если нам надо изменить сам strs. Преимущество Делфи в том что тут можно совместит два смежной методики, програмируя бизнес-логики приложения в функциональном стиле, а гуй в императивном. |
Сообщ.
#48
,
|
|
|
Пример с уже знакомым Aggregate + Union + Empty.
Aggregate - сведение, Union - объдинение, Empty - пустой массив. uses Spring.Collections, Spring.Collections.Enumerable; begin var names1 := TCollections.CreateList<string>([ 'Hartono, Tommy' ]); var names2 := TCollections.CreateList<string>([ 'Adams, Terry', 'Andersen, Henriette Thaulow', 'Hedlund, Magnus', 'Ito, Shu' ]); var names3 := TCollections.CreateList<string>([ 'Solanki, Ajay', 'Hoeing, Helge', 'Andersen, Henriette Thaulow', 'Potra, Cristina', 'Iallo, Lucio' ]); var NamesList:= TCollections.CreateList<IList<string>>([names1, names2, names3]); // Only include arrays that have four or more elements var AllNames:= Enumerable<IList<string>>.Create(NamesList.ToArray) .Aggregate<IEnumerable<string>>(TEnumerable.Empty<string>, function (current: IEnumerable<string>; next: IList<string>): IEnumerable<string> begin Result:= current; if next.Count > 3 then Result:= TEnumerable.Union<string>(current, next); end ); // print for var name in AllNames do begin Writeln(name); end; (*C# code string[] names1 = { "Hartono, Tommy" }; string[] names2 = { "Adams, Terry", "Andersen, Henriette Thaulow", "Hedlund, Magnus", "Ito, Shu" }; string[] names3 = { "Solanki, Ajay", "Hoeing, Helge", "Andersen, Henriette Thaulow", "Potra, Cristina", "Iallo, Lucio" }; List<string[]> namesList = new List<string[]> { names1, names2, names3 }; // Only include arrays that have four or more elements IEnumerable<string> allNames = namesList.Aggregate(Enumerable.Empty<string>(), (current, next) => next.Length > 3 ? current.Union(next) : current); foreach (string name in allNames) { Console.WriteLine(name); } /* This code produces the following output: Adams, Terry Andersen, Henriette Thaulow Hedlund, Magnus Ito, Shu Solanki, Ajay Hoeing, Helge Potra, Cristina Iallo, Lucio */*) end. Что то подобное мы уже делали... |
Сообщ.
#49
,
|
|
|
Пример средней сложности GroupBy:
uses System.SysUtils, System.Math, Spring.Collections; type TPet = record Name: string; Age: double; constructor Create(AName: string; AAge: double); end; TTotalInfo = record Key: integer; Count: integer; Min: double; Max: double; constructor Create(AKey, ACount: integer; AMin, AMax: double); end; { TPet } constructor TPet.Create(AName: string; AAge: double); begin Name:= AName; Age:= AAge; end; { TTotalInfo } constructor TTotalInfo.Create(AKey, ACount: integer; AMin, AMax: double); begin Key:= AKey; Count:= ACount; Min:= AMin; Max:= AMax; end; begin // Create a list of pets. var PetsList:= TCollections.CreateList<TPet>([ TPet.Create('Barley', 8.3), TPet.Create('Boots', 4.9), TPet.Create('Whislers', 1.5), TPet.Create('Daisy', 4.3) ]); // Group Pet.Age values by the Math.Floor of the age. // Then project an anonymous type from each group // that consists of the key, the count of the group's // elements, and the minimum and maximum age in the group. var query:= TEnumerable.GroupBy<TPet, integer, double, TTotalInfo>(PetsList, function (pet: TPet): integer begin Result:= Floor(pet.Age); end, function (pet: TPet): double begin Result:= pet.Age; end, function (baseAge: integer; ages: IEnumerable<double>): TTotalInfo begin Result:= TTotalInfo.Create(baseAge, ages.Count, ages.Min, ages.Max); end ); // Iterate over each anonymous type. for var result in query do begin Writeln; WriteLn('Age group: ', result.Key); WriteLn('Number of pets in this age group: ', result.Count); WriteLn(Format('Minimum age: %.1f', [result.Min])); WriteLn(Format('Maximum age: %.1f', [result.Max])); end; end; (* C# code // Create a list of pets. List<Pet> petsList = new List<Pet>{ new Pet { Name="Barley", Age=8.3 }, new Pet { Name="Boots", Age=4.9 }, new Pet { Name="Whiskers", Age=1.5 }, new Pet { Name="Daisy", Age=4.3 } }; // Group Pet.Age values by the Math.Floor of the age. // Then project an anonymous type from each group // that consists of the key, the count of the group's // elements, and the minimum and maximum age in the group. var query = petsList.GroupBy( pet => Math.Floor(pet.Age), pet => pet.Age, (baseAge, ages) => new { Key = baseAge, Count = ages.Count(), Min = ages.Min(), Max = ages.Max() }); // Iterate over each type. foreach (var result in query) { Console.WriteLine("\nAge group: " + result.Key); Console.WriteLine("Number of pets in this age group: " + result.Count); Console.WriteLine("Minimum age: " + result.Min); Console.WriteLine("Maximum age: " + result.Max); } /* This code produces the following output: Age group: 8 Number of pets in this age group: 1 Minimum age: 8.3 Maximum age: 8.3 Age group: 4 Number of pets in this age group: 2 Minimum age: 4.3 Maximum age: 4.9 Age group: 1 Number of pets in this age group: 1 Minimum age: 1.5 Maximum age: 1.5 */*) end. |
Сообщ.
#50
,
|
|
|
Тот же пример на Ньютоне
импорт Система.СисУтилиты, Система.Мат, Спринг.Коллекции; ТПет: запись Имя: строка; Возраст: дабл; конструктор: (ПИмя: строка; ПВозраст: дабл) -- Имя = ПИмя; Возраст = ПВозраст; конец; ТТоталИнфо: запись Ключ: целое; Колво: целое; Мин: дабл; Макс: дабл; конструктор: (ПКлюч, ПКолво: целое; ПМин, ПМакс: дабл) начать Ключ = ПКлюч; Колво = ПКолво; Мин = ПМин; Макс = ПМакс; конец; конец; ГруппироватьПоПример: функция начать // Создать список домашних животных. пер ПетСписок = ТКоллекции.Список( ТПет('Барли', 8.3), ТПет('Бутс', 4.9), ТПет('Вислерс', 1.5), ТПет('Дайзи', 4.3) ); пер запрос = ТПеречислимый.ГруппироватьПо(ПетСписок, (пет: ТПет) -- вернуть Флор(пет.Возраст), (пет: ТПет) -- вернуть пет.Возраст, (базВозраст: целое; возрасты: ИПеречислимый<дабл>) -- вернуть ТТоталИнфо(базВозраст, возрасты.Колво, возрасты.Мин, возрасты.Макс) ); цикл по запрос -- результат начать Вывод('Группа возраст: ', результат.Ключ); Вывод('Число петс в этой возрастной группе: ', результат.Колво); Вывод(Формат('Минимальный возраст: *', [результат.Мин])); Вывод(Формат('Максимальный возраст: *', [результат.Макс])); конец; конец; - Коуч что это? Это друг мой новий язык программирования НЬЮТОН! Давно хотел понять что ощущают англоязычные коллеги |