Module-3
2:31
3 ай бұрын
Пікірлер
@vadimkuzmin8306
@vadimkuzmin8306 Күн бұрын
Купалинка
@yariypriyanka6171
@yariypriyanka6171 4 күн бұрын
Я уже успугался, когда Вы сказали, что не нравятся мои курсы)
@ThorenSky
@ThorenSky 11 күн бұрын
00:00 урок 5 хвостовая рекурсия. 00:10 понятие хвостовая рекурсия аналог циклов в ФП 00:40 отличия рекурсии и цикла. Память на стеке 01:24 ограничения глубины рекурсии в разных языках 02:00 проблема повышения памяти в рекурсии. Оптимизация - хвостовая рекурсия. 02:20 разбор примеров обычной и хвостовой рекурсии. в чем отличия 04:25 формальное определение хвостовой рекурсии 04:55 зачем нужна безконечная рекурсия 05:50 конкретные примеры кода с разбором используемой памяти 06:04 вычисление факториала. обычная рекурсия 08:01 вычисление факториала. хвостовая рекурсия 09:35 Заметка. Рекурсия с аккумулятором интерфейсные и приватные тела функции. 10:45 :erlang.process_info - смотрим на использование памяти в разных видах рекурсии. 12:10 как получить разные виды памяти процесса :total_heap_size :stack_size 15:45 использование памяти для вычисления факториала от 10_000 обычная рекурсия 16:10 тоже самое для хвостовой рекурсии 18:00 подводим итог сравнения двух видов рекурсии для решения факториала 18:40 сравнение двух видов рекурсий на задаче суммирования элементов списков 23:50 подведение итога. 24:45 The Seven Myths of Erlang performance - статья о том как писать хороший код 25:38 общая рекомендация о написании эффективного кода.
@user-cp4du7pi5t
@user-cp4du7pi5t 12 күн бұрын
На JS максимальный стек 10_000 +- в зависимости от среды исполнения
@YuriZhloba
@YuriZhloba 12 күн бұрын
Спасибо, будем знать )
@ThorenSky
@ThorenSky 16 күн бұрын
00:10 Рекурсия зачем нужна и где используется. 00:54 Первая рекурсивная функция - определение длинны списка 03:08 Длинна списка - как работает эта реализация и что со стеком. 04:04 Максимальный элемент списка. 06:32 lix_max как работает. Что происходит на стеке 07:55 set_value изменение элемента списка по заданной позиции 12:41 свой аналог `Range |> Enum.to_list()` 16:04 swap - попарная замена элементов списка. 16:50 как из головы списка извлекать сразу несколько значений 19:08 Итог рассмотренных примеров. Чем полезно понимание рекурсии
@ThorenSky
@ThorenSky 18 күн бұрын
00:10 Постановка задачи к изучению. Почему списки так важны в ФП. 01:05 Представление списков в памяти. Однонаправленный связанный список. 01:50 Добавление нового элемента в список. Что при этом происходит в памяти. 02:40 Оператор cons - присоединение элемента к списку. Цепочка операторов cons 03:20 Консоль: список как цепочка операторов cons (`[value|list]`) 04:24 В памяти: Создание списка через цепочку операторов cons 05:05 Двунаправленный связанный список, строение 05:54 Двунаправленный связанный список поведение в памяти. Иммутабельность 07:25 Почему двунаправленный связанный список не эффективен в иммутабельных языках 08:25 Стоимость операций для списков 09:10 Почему операция добавления элемента в конец однонапр. связного списка дорогая 10:32 Стоимость сложения двух списков (Оператор ++) Как это работает. 11:30 Строки тоже списки. О дороговизна операции конкатенации строк. IO-List 12:00 Стоимость операций для массивов. Строение массива. Мутабельная структура 13:58 Чем хороши массивы - главное их преимущество 14:00 Почему массивов нет в Эликсире и других языках с иммутабельной памятью 14:30 Эмуляция массивов в Эликсир через стороннюю библиотека Array. В чём повох? 16:16 Эрланг встроенный модуль :array. Как это работает под капотом. Кортеж. 19:30 Почему в языках с иммутабельной памятью нельзя реализовать обычный массив. 19:58 Итог. Компромисс в пользу иммутабльености.
@ThorenSky
@ThorenSky 26 күн бұрын
00:14 Начало о чём будет 5й урок 00:20 Об иммутабельности что это и зачем 00:40 Польза иммутабельности 03:28 Картинки(схемы). Данные и указатель Stack & Heap 04:23 4 варианта иммутабельности 05:00 какие языки какие варианты мутабельности используют 06:06 iex-консоль: примеры иммутабельности в Эликсир, на примере списков 07:40 erl-консоль: примеры иммутабельности в Эрланг (переменные иммутабельны) 08:50 Переиспользование памяти(оптимизация иммутабельных значений в Эликсир) 09:24 Пример изменения полей сущности предметной области в Эликсир (user на Map) 10:38 Зачем придумали Structure Sharing(Переиспользование памяти) и как это работает
@ThorenSky
@ThorenSky Ай бұрын
Благодарю за подробное и доходчивое объяснение этого синтаксиса. Раньше по-началу постоянно путался с этой запятой и двоеточием в односрочниках типа ,do: и им подобных. Теперь же зная как это работает "под капотом", понимая что это по сути просто синтаксический сахар на основе keyword и макросов путаница исключена. Всё таки макросы в Эликсир это широкоиспользуемая вещь даже на уровне самого языка. отсюда и всякие казалось бы непонятные выверты в его синтаксесе. Но с другой стороны и возможностей больше всяких интересных.
@ThorenSky
@ThorenSky Ай бұрын
00:10 о чём будет данное видео. Соотношение keyword-list-ов с макросами 00:40 конкретный пример того, что будем разбирать в этой теме. 01:18 вспоминаем уже известное про keyword-list, синтаксический сахар 03:39 начало эксперементов с макросами. Макрос if. Доходим до сути. 09:35 истинный вид макроса if без синтаксического сахара 10:10 другие макросы работают точно так же как разобранный макрос if 10:30 макрос def, определение функции 12:00 истинный вид макроса def без синтаксического сахара 12:24 макрос defmodule 13:45 истинный вид макроса defmodule без синтаксического сахара 14:05 что будет если попытаться подсунуть доп. ключ в keyword-list макроса defmodule и def 15:35 осознание общей механики работы макросов if, def, defmodule 15:48 разбор блока do/end, полный вид - это синтаксический сахар для `,do:` 16:32 приходим к пониманию зачем запятая и двоеточие рядом с `do` 17:14 Домашнее задание. Функции для шахмат и крестики-нолики.
@user-zy5dd5fq4q
@user-zy5dd5fq4q Ай бұрын
можно было в функции add_spaces вызывать противоположную сторону рекурсивно
@YuriZhloba
@YuriZhloba Ай бұрын
да, можно
@kvatofermer
@kvatofermer Ай бұрын
Меня радует количество просмотров и комментариев под видео курса от Юры. Очень хочется популяризировать эту прекрасную технологию! Автора могу только поздравить и пожелать не останавливаться на достигнутом! Спасибо тебе большое! :)
@YuriZhloba
@YuriZhloba Ай бұрын
спасибо )
@ThorenSky
@ThorenSky Ай бұрын
00:20 Вспоминаем разобранную конструкцию case 00:40 от case к cond, вспоминаем fizzbuzz 01:20 cond - эквивалент цепочкам if-else-if-else.. 01:40 продолжаем разбор control_flow.ex, тонкости работы `cond` 02:30 смотрим как работает код в действии через консоль iex 03:08 когда и почему возникает CondClauseError как исправить(catch-all) 04:14 о важности очерёдности условий, отсутствие предупреждений компилятора 05:30 `cond` как эквивалент конструкции `if` 06:19 от `cond` к `if` 07:00 `cond` может собой полностью заменять `if`(Почему в Эрланг нет `if`) 07:28 разница в `if` и `cond`, когда поведение становится разным. nil и ошибка. 08:30 важная особенность конструкций if-cond-case - возврат значения. 10:40 как if-cond ведут себя в других языках? ФП, rust, о наличии обоих ветей 11:14 особенности использования guard в case и cond, какие есть отличия. 13:20 ошибка компиляции при использовании своих функций в guard-ах внутри case 13:55 обход, как использовать свои функции в guard-ах (например внутри `case`)
@snobsnobov9999
@snobsnobov9999 Ай бұрын
Отличный материал! С нетерпением жду следующих уроков.
@ThorenSky
@ThorenSky Ай бұрын
Если в двух словах то pattern-matching позволяет нам осуществлять ветвление в коде на основе типов и структур данных, но не их конкретных значений или неких свойств этих значений. Тогда как механика стражей (Guards) или как их еще называют "ограничителей", по сути расширение для pattern-matching, которое позволяет ветвить код уже даже на основе конкретных значений. Основное что нужно помнить работая с Guard: - значение Guard-выражения должно быть логическим - из Guard-ов можно составлять целые цепочки через `and` и `or` - исключения из Guard-выражения не выходят на ружу а просто выдают false как результат этого Guard-выражения - всё подряд использовать в Guard не выйдет. в документации описано что именно можно использовать. чаще всего это функции из модуля Kernel.(Основная их идея - чистые функции без побочных эффектов) hexdocs.pm/elixir/Kernel.html#guards hexdocs.pm/elixir/patterns-and-guards.html#guards
@ThorenSky
@ThorenSky Ай бұрын
00:23 Охранные выражения(Guards) Что это такое 00:50 конкретный пример: ветвление кода на основе возвраста животного 01:10 Case+Guards (внутри функции) 03:38 Case+Guards Конкретный пример с обьяснениями как это работает 05:32 Clauses+Guards (в сигнатурах тел функций) 06:40 О взаимозаменяемости case и тел функций и поддержки Guard-ов 07:00 Цепочки Guard-ов. `and` и `or` 07:30 Конкретный пример работы с Guard. Библиотека книг: рейтинг и количество. 11:01 Какие выражения можно использовать в Guard-ах.(Можно не все доступные) 11:38 Конкретный пример попытки использования своей функции в Guard-е 12:12 Почему Elixir/Erlang не поддерживает вызов всех функций в Guard-ах 12:30 Выходим на макросы читая вывод ошибок компиляции 12:50 Как использовать макросы в Guard-выражениях своих функций 13:00 Как подключать макросы (require) На примере is_odd is_even(модуль Integer) 14:04 О создании своих макросов для использования их в Guard-ах 14:50 Как работают исключения внутри Guard - вычисление в false 16:30 Что происходит когда в предекате Guard происходит исключение (/0) 17:20 Почему исключения в Guard-ах не входят наружу, а просто выдают false. 19:40 Разбор практического применения такого поведения Kernel.map_size/1.
@YuriZhloba
@YuriZhloba Ай бұрын
Очень подробные таймкоды, буквально поминутно. Круто )
@ThorenSky
@ThorenSky Ай бұрын
@@YuriZhloba Благодарю, это потому что материал насыщенный. Стараюсь только главное выделять - то,что хорошо бы запомнить и усвоить. Ну и задел на будущее - если чего подзабыл то было бы легко и быстро найти нужное место и вспомнить пройденное. Благодарю за курс и отличное видео к нему!
@ThorenSky
@ThorenSky Ай бұрын
00:48 сопостабление с образцом и отличие функциональных от императивных языков 02:42 подробное рассмотрение ветвления в коде (control flow) 02:45 конструкция case в общем виде 03:36 упражнение: два уровня ветвления и 6 разных веток кода (домашние животные) 07:03 запускаем код нового модуля в iex-оболочке 07:14 создание короткого псевдонима для полного имени модуля( aliase .. as ..) 08:40 недостаток громоздких вложенных case-конструкций 09:20 упрощение кода case-структуры. Один case проверяющий сразу два значения 11:37 о достоинствах плоской case-структуры(1 уровень вложенности) 11:55 ошибка в case когда есть неучтённые ветви исполнения CaseClauseError 12:24 ветвления через тела функций (clause) 13:34 одна функция с четырьмя телами. Как это работает. (сопоставление по аргументам функции) 14:01 проверяем тела функций в действии (iex) 15:12 взаимозаменяемость тел функций и case-ветвлений 15:24 FunctionClauseError ошибка когда есть неучтённые аргументы для функции, (когда значения входящих аргументов не совпадают ни с одним описанным шаблоном) 15:45 о важности порядка описания шаблонов сопоствления в телах функций 16:38 предупреждения от компилятора при ошибочном построении шаблонов для функций 16:57 о проблеме "clause cannot match because a previous clause always matches" 17:18 более широкие шаблоны перехватывают более узкие.(О порядке шаблонов в коде) 17:29 о важности очередности шаблонов. как исправлять `always matches` 18:25 тонкость работы компилятора при определении более широких и узких шаблонов. 20:37 шаблон "catch all" 21:52 как сделать более специализированный шаблон для проверки валидности структуры данных 22:46 best practice с написанием "catch all"-шаблонов. пропускать только валидные данные.
@ThorenSky
@ThorenSky Ай бұрын
00:00:58 как проверить есть ли ключ в словаре(map) 00:02:14 шаблон пустой map. проверка является ли значение словарём(map) 00:02:39 проверка наличие ключа в словаре, когда ключи не атомы. 00:03:00 о совпадении синтаксиса шаблона слева с созданием словаря(map) 00:04:35 особенности рабыты pattern-matching со словарями 00:04:44 об извлечении ключей из словаря через pattern-matching 00:05:35 почему нельзя использовать переменные как ключи в PM-шаблоне для map 00:06:08 использование pin-оператора при сопоставлении словарей 00:07:20 вложенный словарь пример извлечения значений из произвольной глубины 00:07:40 создаём вложенную структуру на примере библиотеки книг 00:09:20 извлечение значений из словаря на 1м уровне вложенности 00:10:50 извлечение id всех трёх книг в отдельные переменные 00:11:23 что будет если в шаблоне используем одно и тоже имя переменной дважды 00:11:50 бонус: get_in put_in update_in макросы для вложенных структур данных. 00:12:18 интересный макрос get_in для извлечения значений(забегая вперёд) 00:12:50 get_in - как быть когда в пути встречается список Access.all() 00:13:22 get_in - как выстроить путь для извлечения нужного элемента в списке Access.at(N)
@rusty_scissors
@rusty_scissors Ай бұрын
Замечательно! Заметен прогресс, и фон очень интересный, залипательный
@MbwiruEikura
@MbwiruEikura Ай бұрын
Ого, не знал про v()
@ThorenSky
@ThorenSky 2 ай бұрын
00:00:20 про бусти и как поддержать выпуск видео. 00:01:40 о безплатной подписке(follow) на бусти, как один из способов поддержать автора 00:02:10 засветка планов. на 2й(OTP+многопоточность) и 3й(Phenix-вебфреймоврк) курсы 00:02:39 к делу, знакомство с pattern-matching на практике 00:03:10 в Elixir то что выглядит как присваивание на деле это pattern-matching 00:03:53 тривиальные случаи сопоставления с образцом(pattern-matching) 00:04:16 сопоставление кортежей 00:04:37 использование переменных в шаблонах сопоставления 00:05:22 как работает сопоставление составных структур данных 00:05:40 что происходит при несовпадении шаблона и выражения справа 00:06:19 еще раз о том как именно работает pattern-matching. исключение MatchError 00:07:02 Для чего всё это нужно? Как использовать Pattern-matching на практике 00:07:10 Задачи выполняемые pattern-matching(сопоставлением с образцом): 00:07:14 - Первая задача - присваивание значения переменной 00:07:20 - Вторая задача - извлечение вложенных значений из структур данных 00:07:28 - Третья задача - реализация условных переходов 00:07:40 Рассмотрение 2й задачи извлечение значений при сопоставлении 00:08:08 - Простейший случай: извлечения всё из права в переменную слева 00:08:20 - случай шаблон со структурой(кортеж) и константы + перeменные в нём 00:09:20 - изменение значений переменных указанных в шаблоне сопоставления 00:09:25 Важная Особенность сопоставления делающая её мощной и удобной вещью 00:09:40 Упражнение: создания развесистой структуры и извлечение данных из неё 00:11:20 Собираем команду из трёх разработчиков в один кортеж 00:11:56 Подсчёт уровня вложенности в получившейся структуре. 00:12:10 Обкатка шаблонов сопоставления с образцом: 00:12:16 - Извлечение названия команды 00:12:31 - Лайфхак как быть если забыл сохранить значение в переменную `v()` 00:12:58 - Про универсальный шаблон - знак подчёркивания `_`. Зачем и как работает. 00:13:30 - Что будет если указать неправильный шаблон? 00:13:48 - Извлечение списка разработчиков в переменную members 00:14:30 О практике использования атома как первого эл-та кортежа. Зачем? Что даёт. 00:15:20 - Извлекаем данные из всё более глубокого уровня вложенности 00:16:48 - Одновременное извлечение сразу несколько данных. роль и скилы 00:17:20 Итог - освоили как с помощью шаблонов залезать на любую глубину данных 00:17:39 Формализуем полученные знания. 00:17:39 - Что внутри себя может содержать шаблон(часть слева) 00:17:50 - Что не может внутри себя содержать шаблон 00:18:25 - Что может быть в выражении с права(образец-значение) 00:18:55 Использование в шаблоне одной и той же переменной несколько раз. 00:19:51 Pin-оператор использование значение переменной при сопоставлении
@montecristo31
@montecristo31 2 ай бұрын
А будет феникс?
@YuriZhloba
@YuriZhloba 2 ай бұрын
Будет в отдельном курсе, не в этом :)
@montecristo31
@montecristo31 2 ай бұрын
Спасибо, было бы классно если бы в будущем разобрали работы с hex.
@YuriZhloba
@YuriZhloba 2 ай бұрын
Сорри, я не понял, что такое "работа с hex". Работа с восьмиричной системой исчисления? Или с hex-репозиторием erlang/elixir библиотек?
@MbwiruEikura
@MbwiruEikura 2 ай бұрын
Ещё KeywordList использую вместо мапы(словаря), если важен порядок следования ключей при обработке
@YuriZhloba
@YuriZhloba 2 ай бұрын
Да, я забыл про это сказать.
@ThorenSky
@ThorenSky 2 ай бұрын
00:00:22 IO.List 00:07:10 Keyword List 00:10:08 Зачем нужен KeywordList. случаи где используются KeyworList 00:14:30 Другие примеры применения KeywordList. Конфиг подключения к дб. 00:15:38 KeywordList в DSL-языках на основе макросов (Ecto.Query для запросов к БД) 00:16:54 Завершение 3го урока. Домашка для закрепления материала
@rusty_scissors
@rusty_scissors 2 ай бұрын
Замечательно!
@ThorenSky
@ThorenSky 2 ай бұрын
Правильно ли я понимаю, что при присвоении именованной функции в переменную через амперсанд (`&`) под копотом происходит создание анонимной функции(т.е. лямбды). Которая по сути и оборачивает именованную функцию, которую мы дальше можем присваивать в переменную и передавать как значение?
@ThorenSky
@ThorenSky 2 ай бұрын
Пример есть анонимная функция записанная в полном синтаксисе iex> my_func = fn a, b -> a <= b end #Function<41.105768164/2 in :erl_eval.expr/6> проверяем что работает iex> my_func.(1, 2) true убеждаемся что операторы - это тоже функции: iex> h Kernel.<= def left <= right .. Less-than or equal to operator. "оборачиваем" функцию Kernel.<= в лямбу через амперсанд iex> my_lt_func = &<=/2 # Kernel.<=/2 &:erlang."=<"/2 iex> is_function(my_lt_func) true iex> my_lt_func.(1, 2) true
@YuriZhloba
@YuriZhloba 2 ай бұрын
Нет, это лишнее. Переменная указывает на какую-то область памяти, где хранится функция. И тут не важно, анонимная она или именованая. Нет необходимости заворачивать именованую функцию в анонимную.
@YuriZhloba
@YuriZhloba 2 ай бұрын
можно и без переменной обойтись iex(2)> (&<=/2).(:arg1, :arg2) true
@ThorenSky
@ThorenSky 2 ай бұрын
@@YuriZhloba Благодарю за ответ. Да верно это же можно проверить через iex iex> f = fn v -> IO.puts(v) end #Function<43.105768164/0 in :erl_eval.expr/6> iex> f = &IO.puts/1 &IO.puts/1 Как видно во втором случае выводится нечто напоминающее скорее адрес именованной функции но не подобное тому что создаётся для лямбды
@ThorenSky
@ThorenSky 2 ай бұрын
00:20 pid - process id 01:11 send отправка сообщения процессу(самому себе) 01:16 flush проверка пришедшего сообщения 01:20 запуск нового процесса, отправка сообщения, анонимная функция 02:50 port пример открытия TCP и UDP сокетов 04:26 reference 05:26 function 05:50 что такое функция высшего порядка 06:56 сохранение именнованной функции в переменную (через &) 07:50 передача функции как аргумент-значение в другую функцию (apply_twice) 09:40 Более реальный пример передачи функции как значения (Enum.filter) 11:12 Еще один практический пример передачи функции Enum.map() 12:18 Особенность Эликсира - возможность сравнивать значения любых типов 14:05 порядок сравнения разных типов 14:20 пример сортировки любых значений 15:25 Enum.sort сортировка словарей(Map) с ключами атомами(выход на Keyword list) 15:44 Исследуем как работает Enum.sort с Map. превращение Map в список кортежей
@YuriZhloba
@YuriZhloba 2 ай бұрын
Спасибо за таймкоды )
@ThorenSky
@ThorenSky 2 ай бұрын
Благодарю за живую практику
@AllansKun
@AllansKun 2 ай бұрын
Спасибо, было интересно послушать)
@RomanDmitrikov
@RomanDmitrikov 2 ай бұрын
При расширении файла exs выдается ошибка (undefinedfunctionerror). При расширении ex все работает.
@YuriZhloba
@YuriZhloba 2 ай бұрын
Не зная твоего окружения не могу прокомментировать. По идее не должно быть разницы, интерпретатору важно содержимое файла, а не его расширение.
@ThorenSky
@ThorenSky 2 ай бұрын
В этом видео нашел "пасхалку" с ответом на свой вопрос о том, какую книгу рекомендуется почитать пытливым умам интересующимся Эликсиром. И как оказалось, совсем недавно, в начале года вышла её третья часть.
@YuriZhloba
@YuriZhloba 2 ай бұрын
Да, это хорошая книга )
@kvatofermer
@kvatofermer Ай бұрын
@@YuriZhloba не Саша Юрич ли?))
@YuriZhloba
@YuriZhloba Ай бұрын
@@kvatofermer всё может быть )
@freeFHH
@freeFHH 2 ай бұрын
mix в курсе будет рассматриваться?
@YuriZhloba
@YuriZhloba 2 ай бұрын
Да, будет, в 7-м уроке.
@YuriZhloba
@YuriZhloba 2 ай бұрын
Местами на фоне есть шум от коллег из соседней переговорки. Надеюсь, он не очень мешает (
@ThorenSky
@ThorenSky 2 ай бұрын
Да шум есть, но он воспринимается просто как фон, причем нисколько не отвлекающий. Проработал упражнение под видео, совместно пройдя тот же путь и уделяя внимание деталям и тонкостям и ни разу шум не помешал. Думаю, если есть устремление учиться и перенимать опыт, а не искать оправдание своему бездействию то подобный "шум" просто незначительные мелочи. Главное чтобы содержание было достойным, и уроки выходили почаще. Имхо лучше с подобной озвучкой но почаще, чем идеальны звук "но раз в неделю". Благодарю за курс и за стремление делиться своим опытом и знаниями, уроки заходят на ура, единственно что хотелось бы побольше да почаще. но жизнь есть жизнь и в сутках только 24 часа.
@YuriZhloba
@YuriZhloba 2 ай бұрын
@@ThorenSky спасибо )
@mabol7439
@mabol7439 2 ай бұрын
Спасибо, Юрий! Не забрасывайте, материал просто находка 💎!
@YuriZhloba
@YuriZhloba 2 ай бұрын
Спасибо )
@imitsho
@imitsho 2 ай бұрын
Есть функция для сортировки входного списка или сортировать нужно также через аккумулятор?
@YuriZhloba
@YuriZhloba 2 ай бұрын
Да, есть библиотечная функция Enum.sort
@imitsho
@imitsho 2 ай бұрын
@@YuriZhloba спасибо
@snobsnobov9999
@snobsnobov9999 2 ай бұрын
Получается Erma это аналог Ecto?
@YuriZhloba
@YuriZhloba 2 ай бұрын
Erma намного меньше, чем Ecto. Можно сказать, что некий аналог Ecto.Query.
@KavboiHaggis
@KavboiHaggis 2 ай бұрын
почему что в elixir что в haskell, и я так подозреваю во всех подобных функциональных языках, списки реализованы через связный список, а не массив? это же не совсем оптимально выходит что по итерированию что доступу к памяти.
@KavboiHaggis
@KavboiHaggis 2 ай бұрын
поторопился с вопросом )) услышал что тут реализация через массив, но вот в хаскеле вроде бы нет.
@YuriZhloba
@YuriZhloba 2 ай бұрын
Подробный ответ будет в 5-м уроке. Короткий ответ -- так во всех языках, основанных на иммутабельных данных. Это компромисс, мы проигрываем в скорости, но выигрываем в безопасности и простоте программы.
@netsdevs6210
@netsdevs6210 3 ай бұрын
Здравствуйте! Такой вопрос: нужно ли эликсирщику знать Erlang?
@YuriZhloba
@YuriZhloba 3 ай бұрын
Привет. Нет, это не обязательно.
@YuriZhloba
@YuriZhloba 3 ай бұрын
Блин, в конце треугольник всё время называю прямоугольником. Так бывает, когда пишешь код и одновременно говоришь :) Ну зато в коде правильно написано.
@YuriZhloba
@YuriZhloba 3 ай бұрын
Самые внимательные могут услышать, как на фоне мяукает кот )
@snobsnobov9999
@snobsnobov9999 3 ай бұрын
Отличная подача материала, и спасибо что объясняете маленькие нюансы и отличия. Такого в книгах очень мало.
@snobsnobov9999
@snobsnobov9999 3 ай бұрын
Отличный пример рефакторинга. Оба примера рабочие, но второй компактнее и изящнее. Если можно, в будущих уроках так-же показывайте такие примеры самосовершенствования - make it works -> make it right.
@snobsnobov9999
@snobsnobov9999 3 ай бұрын
Хорошая, понятная подача материала, а с тестами вообще отлично. Спасибо, продолжайте.
@imitsho
@imitsho 3 ай бұрын
Спасибо
@nceryu
@nceryu 3 ай бұрын
Огромное спасибо за такой курс!
@snobsnobov9999
@snobsnobov9999 3 ай бұрын
Можно добавить, что существует Nerves Project на Elixir, благодаря которому можно создавать прошивки для Raspberry Pi и вплоть до дженерик x86_64 based hardware. Существует так-же множество драйверов для сенсоров написанных на Elixir, которые можно использовать в обвязке Nerves прошивок. Другими словами, направление IoT на Elixir так-же развивается.
@YuriZhloba
@YuriZhloba 3 ай бұрын
Пасиб. Создай плз issue тут github.com/yzh44yzh/elixir_course/issues если не трудно )
@snobsnobov9999
@snobsnobov9999 3 ай бұрын
Полезно добавить, чтобы история ввода в консоли iex сохранялась на Mac/Linux, нужно в файл ~/.bashrc добавить в конец файла строку: export ERL_AFLAGS="-kernel shell_history enabled" За уроки спасибо, продолжайте.
@YuriZhloba
@YuriZhloba 3 ай бұрын
Ага, я такое себе сделал, а потом забыл, и не мог вспомнить, что именно нужно сделать )
@snobsnobov9999
@snobsnobov9999 3 ай бұрын
Вы не могли-бы пояснить, почему "use ExUnit" не сработал, а use ExUnit.Case сработал? Разве все модули, и конкретно Case не наследуются в случае "use ExUnit"?
@YuriZhloba
@YuriZhloba 3 ай бұрын
Это не наследование, это макрос, который вставляет код в наш модуль. И мы должны точно указать что именно нужно вставить.
@user-oj5kk1zy7f
@user-oj5kk1zy7f 3 ай бұрын
На 3:03 скорее всего опечатка. Имелось в виду 0.3 == 0.1 + 0.2
@YuriZhloba
@YuriZhloba 3 ай бұрын
Да, точно
@odnakolive3635
@odnakolive3635 3 ай бұрын
Поздравляю! 🎉