На главную
ПРАВИЛА FAQ Помощь Участники Календарь Избранное DigiMania RSS
msm.ru
! ПРАВИЛА РАЗДЕЛА · FAQ раздела Delphi · Книги по Delphi
Пожалуйста, выделяйте текст программы тегом [сode=pas] ... [/сode]. Для этого используйте кнопку [code=pas] в форме ответа или комбобокс, если нужно вставить код на языке, отличном от Дельфи/Паскаля.
Следующие вопросы задаются очень часто, подробно разобраны в FAQ и, поэтому, будут безжалостно удаляться:
1. Преобразовать переменную типа String в тип PChar (PAnsiChar)
2. Как "свернуть" программу в трей.
3. Как "скрыться" от Ctrl + Alt + Del (заблокировать их и т.п.)
4. Как прочитать список файлов, поддиректорий в директории?
5. Как запустить программу/файл?
... (продолжение следует) ...

Вопросы, подробно описанные во встроенной справочной системе Delphi, не несут полезной тематической нагрузки, поэтому будут удаляться.
Запрещается создавать темы с просьбой выполнить какую-то работу за автора темы. Форум является средством общения и общего поиска решения. Вашу работу за Вас никто выполнять не будет.


Внимание
Попытки открытия обсуждений реализации вредоносного ПО, включая различные интерпретации спам-ботов, наказывается предупреждением на 30 дней.
Повторная попытка - 60 дней. Последующие попытки бан.
Мат в разделе - бан на три месяца...
Модераторы: jack128, D[u]fa, Shaggy, Rouse_
Страницы: (4) « Первая ... 2 3 [4]  все  ( Перейти к последнему сообщению )  
> Spring4D, Функциональное программирование в действии
    Новичок! :D
    - Да учитель? :huh:
    Учитель :lool:
    Зови меня Коуч :D
    - Ок Коуч :jokingly:
    - А кто это пардон? :huh:
    :blink: неважно :D
    Короче студент пока ты спал я тут немного код поменял в посте #45. Заменил TComparison<T> на TEqualityComparison<T> ибо TComparison возвращал integer, а нам надо boolean что приводило к лишним проверкам.
    - О Коуч так действительно более логично :)
    - У меня вопрос
    Какой?
    - Что такое чистые функции? Вы вначале писали.
    Чистыми называют те функции, которые что-то получают и что-то возвращяют, при этом они не должны изменять какие-то внешние состояния.
    - Примерчик можно? :huh:
    Да вот например пример чистой анонимной функции:
    ExpandedWrap disabled
      function (s: string): integer
      begin
        Result:= Length(s);
      end

    она пулучает строку, а возвращает число, ее результат полнойстью зависит от параметра и всегда возращает одно и тоже значение для одного и того же агрумента. При это в теле функции нет обращений к глобальным переменным или функциям, которые бы были не чистыми. Length тоже чистая функция, поскольку получает строку и возвращает ее длину, я просто обернул ее в анонимку :D
    - Угу а почему они так важны в функционльном програмировании?
    По причине что не меняют внешнее состояние, что как я уже говорил является первм условием функциональной парадигмы. Кроме того чистые функции легко тестировать.
    - А пример грязной функции :jokingly:
    Ну вот например пример :D
    ExpandedWrap disabled
      function(i: integer): integer
      begin
        Result:= Random(i);
      end

    Хотя она принимает один аргумент и возвращает значение, в ней есть вызов грязной функции Random, которая каждый раз возвращает разные значения для одного и того же аргумента. Или вот еще пример
    ExpandedWrap disabled
      var i:= 100;
      function: integer
      begin
        Result:= Inc(i);
      end

    Тут мы имеем дело с изменением внешней переменной.
    - Понятно Коуч! :D
    - Еще вопрос... я тут пытался понять как читать вызовы методов Spring, но тщетно :wacko: не могли бы вы объяснить как их читать?
    Новичок, я сам до недавнего времени разбирался как их читать :D
    Сообщение отредактировано: Cfon -
    "What I cannot create, I don't understand" Richard Feynman.
    https://github.com/Cfon/
    :D
      - Коуч, при всем уважении, но я думаю что лучше удалять прямо из списка sts :huh:
      ExpandedWrap disabled
        strs.Remove('banana');

      Да Новичок ты прав! Черт побери! :D
      При всех преимуществах функционального подхода, не стоит игнорировать императивный стиль, ибо в конце концов нам придеться взаимодействовать с гуем например, чтобы изменять состояние в разных его окошках.
      В данном случае чтоб удалить банан :D естественно надо юзать Remove, при условии конешно, если нам надо изменить сам strs. Преимущество Делфи в том что тут можно совместит два смежной методики, програмируя бизнес-логики приложения в функциональном стиле, а гуй в императивном.
      Сообщение отредактировано: Cfon -
      "What I cannot create, I don't understand" Richard Feynman.
      https://github.com/Cfon/
      :D
        Пример с уже знакомым Aggregate + Union + Empty.
        Aggregate - сведение, Union - объдинение, Empty - пустой массив.
        ExpandedWrap disabled
          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.

        Что то подобное мы уже делали...
        Сообщение отредактировано: Cfon -
        "What I cannot create, I don't understand" Richard Feynman.
        https://github.com/Cfon/
        :D
          Пример средней сложности GroupBy:
          ExpandedWrap disabled
            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.
          Сообщение отредактировано: Cfon -
          "What I cannot create, I don't understand" Richard Feynman.
          https://github.com/Cfon/
          :D
            Тот же пример на Ньютоне
            ExpandedWrap disabled
              импорт
                Система.СисУтилиты,
                Система.Мат,
                Спринг.Коллекции;
               
              ТПет: запись
                Имя: строка;
                Возраст: дабл;
                конструктор: (ПИмя: строка; ПВозраст: дабл) -- Имя = ПИмя; Возраст = ПВозраст;
              конец;
               
              ТТоталИнфо: запись
                Ключ: целое;
                Колво: целое;
                Мин: дабл;
                Макс: дабл;
                конструктор: (ПКлюч, ПКолво: целое; ПМин, ПМакс: дабл)
                начать
                  Ключ = ПКлюч;
                  Колво = ПКолво;
                  Мин = ПМин;
                  Макс = ПМакс;
                конец;
              конец;
               
              ГруппироватьПоПример: функция
              начать
                // Создать список домашних животных.
                пер ПетСписок = ТКоллекции.Список(
                  ТПет('Барли', 8.3),
                  ТПет('Бутс', 4.9),
                  ТПет('Вислерс', 1.5),
                  ТПет('Дайзи', 4.3)
                );
               
                пер запрос = ТПеречислимый.ГруппироватьПо(ПетСписок,
                  (пет: ТПет) -- вернуть Флор(пет.Возраст),
                  (пет: ТПет) -- вернуть пет.Возраст,
                  (базВозраст: целое; возрасты: ИПеречислимый<дабл>) --
                    вернуть ТТоталИнфо(базВозраст, возрасты.Колво, возрасты.Мин, возрасты.Макс)
                );
                
                цикл по запрос -- результат
                начать
                  Вывод('Группа возраст: ', результат.Ключ);
                  Вывод('Число петс в этой возрастной группе: ', результат.Колво);
                  Вывод(Формат('Минимальный возраст: *', [результат.Мин]));
                  Вывод(Формат('Максимальный возраст: *', [результат.Макс]));
                конец;
              конец;

            - Коуч что это? :blink:
            Это друг мой новий язык программирования НЬЮТОН! :jokingly: :jokingly:
            Давно хотел понять что ощущают англоязычные коллеги :blush:
            Сообщение отредактировано: Cfon -
            "What I cannot create, I don't understand" Richard Feynman.
            https://github.com/Cfon/
            :D
            0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
            0 пользователей:


            Рейтинг@Mail.ru
            [ Script Execution time: 0,1376 ]   [ 18 queries used ]   [ Generated: 15.07.19, 22:19 GMT ]