{"id":19133376,"url":"https://github.com/vasnake/fp_haskell-c1","last_synced_at":"2025-07-12T07:33:14.425Z","repository":{"id":212076116,"uuid":"730645403","full_name":"vasnake/fp_haskell-c1","owner":"vasnake","description":"Функциональное программирование на языке Haskell / Денис Москвин / stepik","archived":false,"fork":false,"pushed_at":"2023-12-19T16:41:12.000Z","size":72,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2023-12-19T16:57:18.863Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Haskell","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/vasnake.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null}},"created_at":"2023-12-12T11:21:26.000Z","updated_at":"2023-12-21T13:01:37.004Z","dependencies_parsed_at":"2023-12-21T13:01:34.396Z","dependency_job_id":null,"html_url":"https://github.com/vasnake/fp_haskell-c1","commit_stats":null,"previous_names":["vasnake/fp_haskell-c1"],"tags_count":0,"template":null,"template_full_name":null,"purl":"pkg:github/vasnake/fp_haskell-c1","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/vasnake%2Ffp_haskell-c1","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/vasnake%2Ffp_haskell-c1/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/vasnake%2Ffp_haskell-c1/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/vasnake%2Ffp_haskell-c1/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/vasnake","download_url":"https://codeload.github.com/vasnake/fp_haskell-c1/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/vasnake%2Ffp_haskell-c1/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":264958135,"owners_count":23689006,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-11-09T06:22:14.823Z","updated_at":"2025-07-12T07:33:14.409Z","avatar_url":"https://github.com/vasnake.png","language":"Haskell","funding_links":[],"categories":[],"sub_categories":[],"readme":"# FP Haskell\n\nЧасть 1 / 2\n[Функциональное программирование на языке Haskell / Денис Москвин / stepik](https://stepik.org/course/75/syllabus?next=) /\nhttps://stepik.org/course/Функциональное-программирование-на-языке-Haskell-75 /\nhttps://stepik.org/75\n\n- [Chapter 1, intro](./chapter1.md)\n- [Chapter 2, basics](./chapter2.md)\n- [Chapter 3, lists](./chapter3.md)\n- [Chapter 4, data types](./chapter4.md)\n- [Chapter 5, monads](./chapter5.md)\n\n[Часть 2 / 2](https://github.com/vasnake/fp_haskell-c2)\n\nХороший вводный курс. Кратко, по делу, с интересными задачками.\nНе все задачки одинаково полезны, но, в целом, ОК.\nК сожалению, лектор часто тратит время на подробное объяснение тривиальных вещей, при этом важные концепции ФП и Хаскель упоминаются мимоходом.\nЭффект от этого огорчительный: внимание притупляется пространным рассуждением о банальных вещах и как только ты начинаешь зевать,\nхоп, проскакивает важная мысль. Если успел заметить -- молодец, иди гугли, что это было. Если не успел -- увы, ничего нового не узнал.\n\nПредлагаю: к каждому степу давать список ссылок на материалы для самостоятельного изучения по данной теме.\n\nКурс обязателен к изучению для всех, кто хочет разобраться в функциональном программировании.\nТерминология, паттерны решения проблем - это мастхев и оно тут есть.\n\n[Certificate](./stepik-certificate-75-7e10396.pdf) https://stepik.org/cert/2317467?lang=en\n\n## short notes\n\nНотация и как её читать\n- Отступы важны и увеличение отступа означает \"продолжение блока с предыущей строки\".\n- `foo :: Bar` означает \"нечто foo типа Bar\". `Bar` это тип объекта `foo`.\nНапример: `getListMap :: [(k,v)]` означает \"getListMap имеет тип список туплей (ака пар)\".\n- `a -\u003e b` это базовый стрелочный тип, функция (отображение) из `a` в `b`. А и б это типы, которые населены множеством значений.\n- `\\ x -\u003e some-expressions` это декларация лямбды, лямбда-выражение. Функция, принимающая `х` и что-то делающая.\n- `foo bar` это применение ф. `foo` к параметру `bar`. Имеет наивысший приоритет и левую ассоциативность.\n- Скобочки `(some-expressions)` используются для группировки, явного определения ассоциативности,\nкак конструктор кортежей (в сочетании с запятой `,`).\nОсобый случай: группировка унарного минуса и числа: `(-42)`, без скобок отрицательное число нельзя записать.\n- Квадратные скобки `[x, y, z]` означают список (конструктор списка).\n- Фигурные скобки `{ foo::Int, bar::Char }` означают record syntax в определении конструктора данных, где пара `foo::Bar` означает \"метка::Тип\".\n- Оператор \"не-равно\" записывается как `/=` в отличие от привычного  `!=`.\n- Обратная стрелочка `\u003c-` используется в list comprehension, в монадических цепочках (do-нотация), как метафора для \"получить из\" или \"присвоить\".\n- `data`: ключевое слово, начало определения типа данных (конструктор типа `=` конструктор(ы) данных)\n- `type`: ключевое слово, начало определения синонима (алиаса) типа (конструктор типа `=` конструктор типа)\n- `newtype`: ключевое слово, начало определения эфемерного типа с одним конструктором и одним параметром конструктора\n- `case ... of ...`: позволяет использовать пат.мат. в правой части уравнений.\n- `do ...`: запись цепочки монадических вычислений (пайплайн стрелок Клейсли, связанных оператором монадыц `bind`)\n- `let ... in ...`, `where`: два способа абстрагировать вычисления внутри функции\n\nСуществует охулиард \"операторов\", например `.`, `$`, `\u0026`, `\u003c$\u003e` и т.д. Это инфиксные двух-параметрические функции,\nобладающие ассоциативностью (левой или правой) и приоритетом (число от 0 до 9),\nприменение которых можно записывать не только в инфиксном, но и в префиксном виде, e.g. `(+) 40 2`.\nПолезно смотреть информацию по операторам в repl, e.g. `ghci\u003e :info (/=)`.\n\nВ интерпретаторе можно выполнять многострочные блоки кода, это делается так (см. маркеры `:{`, `:}`)\n```hs\nghci\u003e :{\nghci| foo :: (Num b) =\u003e a -\u003e b\nghci| foo x = 42\nghci| :}\n```\nrepl\n\n\u003e A `parameter` is a variable in a function definition. It is a placeholder and hence does not have a concrete value.\nAn `argument` is a value passed during function invocation.\n\n\u003e In logic, mathematics, and computer science, `arity` is the number of arguments or operands ...\nIn mathematics, `arity` may also be called `rank`....\nIn logic and philosophy, `arity` may also be called `adicity` and `degree`\nIn linguistics, it is usually named `valency`\n\nПочему типы данных `SomeTuple = Pair(a, b)` и `Maybe = Nothing | Just a` называются, соответственно, \"product\" и \"sum\"?\nНазвание вытекает из ответа на вопрос: как посчитать область значений, покрываемую парой? `a * b`, перемножить мощности.\nДля суммы, разумеется, сложить мощности.\n\nКогда вы слышите \"сборка списка\", надо понимать, что список собирается добавлением головы к хвосту.\nТ.е. сборка - это выращиевание списка добавлением элементов справа-налево `let xs = 1:(2:(3:[]))`\n\nРабота с бесконечными последовательностями опирается на ленивость (вычисления до WHNF) и концепцию редукции-через-подстановки\n\u003e В Haskell процесс вычисления результата - это череда подстановок\n\n`WHNF`: слабая заголовочная нормальная форма, weak head normal form. Вычисления форсируются до этой формы.\n\n`foldr`, `foldl`: два вида сверток, правая и левая. Правая умеет работать с бесконечностью, левая может быть оптимизирована (TCO).\n\nКомбинатор: функция без свободных переменных, в теле только аргументы и операции применения. См. лямбда-исчисление.\n\nTypeclass: это одно-параметрическое описание интерфейса (API), выделяющего некий \"класс\" типов. Чтобы тип стал членом этого класса,\nдолжен быть реализован instance для этого типа, воплощающий данный интерфейс.\n\nТип: может быть пользовательский (`data`, `newtype`, ...) или встроенный. Любое выражение имеет тип. Тип выражения выводится компилятором.\nСлово `type` используется для создания алиаса существующего типа.\n\nНаблюдение: в ФП часто достаточно видеть сигнатуру (тип) функции, чтобы понять ее смысл, семантику.\nК этому надо стремиться в своем коде.\n\n`Type`, `Kind`, `Class`: терминология иерархии типизации.\nЕсть некое выражение (`42 * pi`), у него есть тип, возможно, оно состоит из других выражений и функций, которые должны быть совместимы по типам.\nПрименение фунции к выражению проверяется на корректность через типы (параметров функции, действительных аргументов).\nЕсть конструкторы типов, по сути - функции над типами. Их корректность проверяется через \"над-типы\" - виды (kind).\nНад выражениями есть типы, над типами есть кайнды.\n\nА есть \"классы\" - `class`, это, на самом деле, type-class, т.е. классы типов.\nПо сути - интерфейсы с одним параметрам типа, определяющие API для некоторого множества типов.\nЧтобы тип мог войти в конкретное множество (тайпкласс), для этого типа должен быть определен `instance`,\nв котором реализованы все обязательные методы интерфейса (class minimal complete definition).\n\ntype-class в Scala: параметризованный интерфейс, один параметр типа.\nИнтерфейс определяет алгебру для множества возможных аргументов этого параметра.\n\nНаиболее важные типы и классы типов\n- List: тип данных\n- Maybe: тип данных\n- Either: тип данных\n- Monoid: type-class (нейтральный элемент и бинарная операция)\n- Kleisli arrow: функция `a -\u003e m b` где тип `m` это враппер над `b`, нужен для поддержки не-чистоты и не-тотальности функции `a -\u003e b`.\n\n- `Functor`: type-class с одним методом `fmap :: (a -\u003e b) -\u003e f a -\u003e f b`:\nподнимает функцию в контекст, aka оператор \"применения\" `\u003c$\u003e`. Структура \"контейнера\" не меняется.\nЗаконы функтора: 1) `fmap id = id`; 2) `fmap (f . g) = (fmap f) . (fmap g)`.\n\n- `Monad`: тайпкласс с двумя методами\n`return :: a -\u003e m a` aka `pure` поднимает значение в монаду, позволяет любую стрелку сделать стрелкой Клейсли `k`.\n`bind :: m a -\u003e (a -\u003e m b) -\u003e m b` aka `\u003e\u003e=` оператор монадического связывания вычислений,\nструктура \"контейнера\" может меняться (вычисления с эффектами).\nЗаконы монад: 1) левая \"единица\" pure `(return a) \u003e\u003e= k = k a`; 2) правая \"единица\" pure `m \u003e\u003e= return = m`; 3) ассоциативность bind `(m \u003e\u003e= k1) \u003e\u003e= k2 = m \u003e\u003e= (\\ x -\u003e k1 x \u003e\u003e= k2)`\n\nВ стдлиб обычно используется соглашение:\n- `runFoo` для запуска вычислений в монаде (и значение и эффекты),\n- `execFoo` для получения эффектов от вычислений (значение игнорируется),\n- `evalFoo` для получения значения и игнорирования эффектов\n\n`Semigroup`, `Monoid`, `Group`\n- полугруппа - это где есть ассоциативная бинарная операция\n- моноид - это полугруппа с единицей\n- группа - это моноид с обратными элементами\n- Не любой моноид - группа, но любая группа - уже моноид.\n\n## links\n\nЧасть 2 / 2\n[Функциональное программирование на языке Haskell (часть 2)](https://stepik.org/course/693/info) /\nhttps://stepik.org/693\n\n- https://hoogle.haskell.org/?hoogle=isDigit\u0026scope=set%3Ahaskell-platform\n- https://wiki.haskell.org/Pronunciation\n- https://github.com/bitemyapp/learnhaskell/blob/master/guide-ru.md\n- https://hub.docker.com/_/haskell/tags\n- https://downloads.haskell.org/~ghc/9.4.7/docs/users_guide/ghci.html?highlight=set#ghci-cmd-:set%20+s\n- https://youtu.be/0h3Ot1C0d2I?feature=shared\n- https://compscicenter.ru/courses/func-prog/2015-spring/\n- https://www.lektorium.tv/course/22797\n- https://youtube.com/playlist?list=PLoJC20gNfC2gpI7Dl6fg8uj1a-wfnWTH8\u0026feature=shared\n- https://github.com/denisshevchenko/ohaskell.guide\n- https://wiki.haskell.org/Programming_guidelines#Naming_Conventions\n\nВсе подряд\n- https://hackage.haskell.org/package/monad-loops-0.4.3/docs/src/Control-Monad-Loops.html#untilJust\n- https://exercism.org/tracks/haskell\n- https://www.youtube.com/playlist?list=PLlb7e2G7aSpRDR44HMNqDHYgrAOPp7QLr\n- https://github.com/hmemcpy/milewski-ctfp-pdf\n- http://sebastian-millies.blogspot.com/2016/02/recursive-function-memoization-with.html\n- https://gitlab.haskell.org/haskell/prime/-/wikis/libraries/proposals/monad-fail#adapting-old-code\n- https://www.youtube.com/watch?v=IkXg_mjNgG4\n- https://www.adit.io/\n- https://egghead.io/courses/professor-frisby-introduces-composable-functional-javascript\n- https://www.schoolofhaskell.com/user/edwardk/snippets/fmap\n- https://medium.com/@xanderdeseyn/grasping-haskell-functors-applicatives-and-monads-part-1-93368e0a7a74#.e3s8heals\n- https://medium.com/@xanderdeseyn/grasping-haskell-functors-applicatives-and-monads-part-2-65255e3e6a1d#.j86j4dlva\n- https://en.wikibooks.org/wiki/Haskell/Category_theory\n- https://bartoszmilewski.com/2014/10/28/category-theory-for-programmers-the-preface/\n- https://youtube.com/playlist?list=PLbgaMIhjbmEnaH_LTkxLI7FMa2HsnawM_\u0026feature=shared\n- https://wiki.haskell.org/Phantom_type\n- https://cdsmithus.medium.com/monoids-are-composable-list-summarizers-77d2baf23ffc\n- https://en.wikipedia.org/wiki/Semigroup_action#:~:\n- https://habr.com/ru/articles/323526/\n- https://stackoverflow.com/questions/18934882/haskell-line-of-code-not-compiling-illegal-datatype-context\n- https://www.codewars.com/kata/haskell\n- https://wiki.haskell.org/H-99:_Ninety-Nine_Haskell_Problems\n- https://wiki.haskell.org/Performance/GHC\n- https://github.com/quchen/articles/blob/master/build.md\n- https://stackoverflow.com/questions/2263541/what-does-mean-in-haskell\n- https://wiki.haskell.org/Lazy_pattern_match\n- https://tio.run/##LYsxCsIwAAD3vOKgDoqktM7WxUFdjKCbihSatMEYpe1QIr49VvC2g7um7O7auRjfMkEdTju1P9422zVSLUjkRwjDQE3BJSBX2J8uC/LsD32j/RhMA3OGGdp1miDEo7R@vF6t9T0TzNNVLQZbcc5J0ytZjF8\n- https://www.futurelearn.com/courses/functional-programming-haskell\n- https://wiki.haskell.org/Monomorphism_restriction\n- https://rsdn.org/forum/decl/4104888.all\n- https://wiki.haskell.org/Programming_guidelines#Naming_Conventions\n- https://github.com/keathley/pointfree.io\n- https://github.com/bmillwood/pointfree\n- https://aosabook.org/en/v2/ghc.html#fig.ghc.pipeline\n- https://downloads.haskell.org/~ghc/7.8.3/docs/html/users_guide/an-external-representation-for-the-ghc-core-language-for-ghc-6.10.html#introduction\n- https://learnyouahaskell.com/starting-out#an-intro-to-lists\n- https://stackoverflow.com/questions/11046590/the-seq-function-and-strictness/11048004#11048004\n- https://downloads.haskell.org/ghc/latest/docs/users_guide/flags.html#compiler-debugging-options\n- https://wiki.haskell.org/Reducible_expression\n- https://wiki.haskell.org/Thunk\n- https://wiki.haskell.org/Weak_head_normal_form\n- https://medium.com/@aleksandrasays/brief-normal-forms-explanation-with-haskell-cd5dfa94a157\n- http://blog.ezyang.com/2011/05/anatomy-of-a-thunk-leak/\n- https://www.haskell.org/onlinereport/haskell2010/haskellch6.html#x13-1270011\n- https://learnyouahaskell.com/types-and-typeclasses\n- https://chalmers.instructure.com/courses/7710/pages/lectures\n- https://www.cse.chalmers.se/edu/year/2018/course/TDA452/\n- https://github.com/bitemyapp/learnhaskell\n- https://wiki.haskell.org/IDEs\n- https://www.haskell.org/ghcup/steps/\n- https://wiki.haskell.org/Prelude\n- https://wiki.haskell.org/Pointfree\n- https://wiki.haskell.org/Keywords#infix.2C_infixl.2C_infixr\n- https://wiki.haskell.org/Section_of_an_infix_operator\n- https://github.com/Copilot-Language/copilot\n- https://gist.github.com/klapaucius/f0adec8a567b7bf000c8bcf99686a9bd\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fvasnake%2Ffp_haskell-c1","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fvasnake%2Ffp_haskell-c1","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fvasnake%2Ffp_haskell-c1/lists"}