На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Модераторы: ElcnU, ANDLL, fatalist
Страницы: (4) 1 2 [3] 4  все  ( Перейти к последнему сообщению )  
> Изучаю Haskell

    И все?! нет батенька от меня так просто не отделаться :lool:
    будьте добры всю функцию wordNums :D

    В прошлом примере я не юзал композицию, в отличие от примера на Хаскелле, давайте заюзим в wordNums композицию и дополнительно для words каррирование. Я не стал юзать кастомную функцию compose и править ручками words, а заюзал библу Ramda
    ExpandedWrap disabled
      const R = require('ramda');
       
      const wordNums = s =>    
          R.compose(
              a => a.map(ws => [ws.length, ws[0]]),
              group,
              qsort,
              R.curry(words)(c => c === ' ')
          )(s);
       
      .........

    получилось длинее, но так для практики пойдет :D

    Еще улучшим код, добавим функцию isSpace
    ExpandedWrap disabled
      const wordNums = s =>    
          R.compose(
              a => a.map(ws => [ws.length, ws[0]]),
              group,
              qsort,
              R.curry(words)(isSpace)
          )(s);
       
      const isSpace = c => /[\s\.;,!?-]/.test(c);

    теперь можно изи добавлять символы игнора :D
    Сообщение отредактировано: Cfon -
      Цитата Serafim @
      Код смотрится отвратно. Я могу сократить его в 10 раз и сделать на порядки читаемее...

      И тишина... походу парнишка сдулся? :-?
      Симка балабол! :D
      Сообщение отредактировано: Cfon -
        ExpandedWrap disabled
          function wordNums(it) {
              return it.length;
          }


        Добавлено
        А, не, так не получится

        Добавлено
        Потому что слова могут быть разделены чем угодно, получается от итератора не получить длины. Т.к. деление по пробелам - некорректно. В итоге:
        ExpandedWrap disabled
          return sentence.split(/\W+/).length;


        Т.е. в функции выше (самой первой) сплит по пробелу надо заменить на сплит по регулярке, а затем длину от итератора.

        А т.к. JS дерьмо и в нём нет корутин, то вместо return передаём значение в анонимочку

        Добавлено
        на пыхе это было бы так:
        Скрытый текст
        ExpandedWrap disabled
          function words(string $sentence): iterable
          {
              $buffer = '';
           
              foreach (\str_split($sentence) as $char) { // Итератор по чарам
                  if (\preg_match(yield $separator, $char)) { // Корутина разделения символов по регулярке с произвольным разделителем
                      $buffer = '' && yield $buffer; // Возвращаем буфер
                      continue;
                  }
           
                  $buffer .= $char; // Конкатенируем с буфером
              }
          }
           
          function word_nums(iterable $words): iterable
          {
              foreach ($words as $i => $word) { // Пробегаемся по словам
                  yield $word; // Возвращаем слово
              }
           
              return $i; // Возвращаем последний индекс
          }


        Добавлено
        Цитата Cfon @
        И тишина... походу парнишка сдулся?

        Да потому что ты хренью страдаешь. Из нормального кода делаешь хрень. Функциональщина нужна там, где она будет профитна, а не везде её пихать. Функции от коллекций в JS работают сразу над всем массивом. Ты его весь держишь в памяти. Это полная дичь. В моём же примере память выделяется ровно в пару-тройку байт. Как только очередное слово находится - память вычищается сразу же.

        И опять же приходим к тому, что в JS нет вообще ленивых коллекций: https://github.com/ramda/ramda/blob/master/source/map.js#L45

        А намного правильнее было бы:
        ExpandedWrap disabled
          export default *function(cb, iterator) {
              for (let item of iterator) {
                  yield cb(item);
              }
          }
          Цитата Serafim @
          Да потому что ты хренью страдаешь. Из нормального кода делаешь хрень. Функциональщина нужна там, где она будет профитна, а не везде её пихать. Функции от коллекций в JS работают сразу над всем массивом. Ты его весь держишь в памяти. Это полная дичь. В моём же примере память выделяется ровно в пару-тройку байт. Как только очередное слово находится - память вычищается сразу же.

          В каком примере?! :wall:
          Ты пока написал пол того что делает мой код! Напиши всю wordNums так чтобы не жрало память, хоть на пыхе хоть на чем мля но тока напиши! А не язычком моли :whistle:
          Код на пыхе что делает? Вывод в итоге какой? Мне надо получить из предложения, список пар где будет слово и число его повторений в предолжении, например
          "hello world hello" -> [[2, "hello"], [1, " world"]]

          Да и напиши свой гавнокод как обещал в 10 раз меньше моего гавнокода :D
          Я буду считать строки :D

          Добавлено
          Цитата Serafim @
          А т.к. JS дерьмо и в нём нет корутин, то вместо return передаём значение в анонимочку

          почему нет корутин? есть :D
          генераторы введенные в ES6 поддерживают их :D
          Сообщение отредактировано: Cfon -
            Цитата Cfon @
            Ты пока написал пол того что делает мой код! Напиши всю wordNums так чтобы не жрало память, хоть на пыхе хоть на чем мля но тока напиши!

            Ну сам попросил:
            ExpandedWrap disabled
              foreach ($words as $word) {
                  yield \substr_count($sentence, $word) => $word;
              }


            Итератор, который возвращает в качестве ключа количество слов, а в качестве значения само слово.

            Цитата Cfon @
            генераторы введенные в ES6 поддерживают их

            генераторы - это не корутины. У генераторов в ES6 нет возможностей корутин.
              Цитата Serafim @
              ExpandedWrap disabled
                foreach ($words as $word) {
                    yield \substr_count($sentence, $word) => $word;
                }

              Итератор, который возвращает в качестве ключа количество слов, а в качестве значения само слово.

              Вывод какой будет тут? Как можно проверить? И у тебя юзаеться готовая фунция substr_count! ты за кого меня держишь? :D, у меня же все ручками! Ну кроме map :D
              Я тоже могу привести в одну функцию
              ExpandedWrap disabled
                const wordNums = s =>
                    group( qsort( words(c => c === ' ', s))).map(ws => [ws.length, ws[0]]);

              Если на входе строка к примеру "hello world hello", а на выходе массив, в котором каждый элемент представлял два значения, первое - слово, второе - число его повторов или наоборот без разницы :D. Я уже выше приводил :wall:
              ExpandedWrap disabled
                // [ [2, "hello"], [1, "world"] ]

              У тебя так? :D

              Цитата Serafim @
              генераторы - это не корутины. У генераторов в ES6 нет возможностей корутин.

              Что ты понимаешь под корутинами?
              Сообщение отредактировано: Cfon -
                Цитата Cfon @
                Что ты понимаешь под корутинами?

                что тут опять начинается?!! было же всё тихо и спокойно... Сифон сам себе байки рассказывал, никого не трогал... и тут вдруг какой-то коротин :oops:

                Добавлено
                я фапще не в теме, поэтому буду ляпать для начала, что не попада
                ExpandedWrap disabled
                  array_count_values( preg_split( '/\s+/', $string ) );
                  Цитата K313 @
                  я фапще не в теме, поэтому буду ляпать для начала, что не попада
                  ExpandedWrap disabled
                    array_count_values( preg_split( '/\s+/', $string ) );

                  да попада :D но тока ты юзаешь готовые функции, а надо ручками :D
                    Цитата Cfon @
                    Я не стал юзать кастомную функцию compose и править ручками words, а заюзал библу Ramda
                    а ты сам то чё? целую либу заюзал?
                      Цитата K313 @
                      Цитата Cfon @
                      Я не стал юзать кастомную функцию compose и править ручками words, а заюзал библу Ramda
                      а ты сам то чё? целую либу заюзал?

                      Ramda.compose не относиться к решению нашей задаче, ее можно не юзать.
                      Вот без compose
                      ExpandedWrap disabled
                        const wordNums = s => group( qsort( words(c => c === ' ', s))).map(ws => [ws.length, ws[0]]);



                      А вот вам императивный вариант wordNums, писал на дровнях :D
                      ExpandedWrap disabled
                        function wordNums(s) {
                            const ws = words(c => c === ' ', s);
                            const result = [];
                            const o = {};
                            
                            for (const w of ws) {
                                o[w] = o[w] ? o[w] + 1 : 1;
                            }
                            for (const w in o) {
                                result.push([o[w], w]);
                            }
                            return result;
                        }

                      Все приходится делать самому! :D

                      ПС. надо ишо words на императивные рельсы поставить :D
                      Сообщение отредактировано: Cfon -
                        ОК а вот и императивный words :D
                        ExpandedWrap disabled
                          function words(p, s) {
                            const result = [];
                            let word = '', cc;
                            let i = 0,  len = s.length;
                            while (i < len) {
                              cc = s[i];
                              if (!p(c)) word += cc;
                              if (p(c) && word !== '') {
                                result.push(word);
                                word = '';
                              }
                              if (i === len - 1) {
                                result.push(word);
                              }
                            }
                          }

                        ПС.  писал на дровнях сильно не пинайте, это чисто императивный стиль :D
                        Вспомнил старый добрый Си :whistle:
                        Сообщение отредактировано: Cfon -
                          Цитата Serafim @
                          Он медленный, жрёт кучу оперативы и не читаемый.

                          Зато в свое время в нем были эпичные баги: https://twitter.com/bos31337/status/116372971509121025 :D
                            Надеюсь теперь с компилятором GHC все порядке :D
                              Хаскель изучил :D
                              догадайтесь че я щас изучаю? :D
                                VBScript?
                                0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                0 пользователей:
                                Страницы: (4) 1 2 [3] 4  все


                                Рейтинг@Mail.ru
                                [ Script execution time: 0,0536 ]   [ 16 queries used ]   [ Generated: 28.03.24, 09:23 GMT ]