Функциональное программирование 22-23

Материал из Wiki - Факультет компьютерных наук
Перейти к: навигация, поиск

Функциональное программирование

Курс по выбору для студентов 3 и 4 курса ФКН ВШЭ, 1 и 2 модуль 2022 г. Функциональное программирование (ФП) представляет собой теоретически изящный, выдержавший проверку временем на практике и оказавший заметное влияние на технологии программирования вообще подход к созданию ПО. Курс посвящен основам ФП в целом и популярного языка Haskell в частности. Попутно сообщаются начальные сведения из области лямбда-исчислений, теории типов, теории категорий.

Преподаватели

Лектор и семинарист: Евгений Дашков, ТГ: @edashkov, edashkov@gmail.com.

Семинарист: Павел Соколов, ТГ: @TurtlePU.

Учебный ассистент: Олег Мкртчян, ТГ: @unwishfulthinking.

Текущая успеваемость

https://docs.google.com/spreadsheets/d/e/2PACX-1vTGKTtVAvjvCheX-dky3tB_W-GQnKunxccajwMziHquQvTDA7pqOGOZUfajFtO20dQhPkx0rurScFju/pubhtml

Setting up

  1. Если вы пользуетесь Windows, установите WSL2, если ещё не.
  2. Установите ghcup — скачайте бинарный файл сами либо введите одну любимую команду:
    • MacOS:
      brew install ghcup
    • Arch-based distros:
      yay -S ghcup-hs-bin
    • WSL2, MacOS >= 10.13, Linux:
      curl --proto '=https' --tlsv1.2 -sSf https://get-ghcup.haskell.org | sh
    • Windows Powershell (cringe): Команда доступна по ссылке
  3. Убедитесь, что путь до места установки ghcup содержится в $PATH — запустите ghcup list.
  4. Установите recommended версии компилятора, пакетного менеджера и языкового сервера:
    ghcup install ghc recommended
    ghcup install cabal recommended
    ghcup install hls recommended
  5. Убедитесь, что путь ~/.ghcup/bin содержится в $PATH. При необходимости добавьте этот путь сами.
  6. Создайте символические ссылки на установленные версии программ:
    ghcup set ghc recommended
    ghcup set cabal recommended
    ghcup set hls recommended
  7. Настройте LSP client в своей любимой среде разработки:
    • Для VS Code есть плагин, он должен обнаружить HLS самостоятельно.
    • В NeoVim настройте nvim-lspconfig, он знает про HLS.
    • Инструкцию для других сред можно найти здесь.
  8. Опционально — установите Hoogle локально:
    1. `cabal install hoogle`
    2. Допишите в файл `~/.ghci` следующее:
      :def hoogle \x -> return $ ":!hoogle \"" ++ x ++ "\""
      :def doc \x -> return $ ":!hoogle --info \"" ++ x ++ "\""
            </li>
            <li>Теперь можно пользоваться Hoogle прямо из ghci с помощью команд `:hoogle` и `:doc`</li>
          </ol>
        </li>
      </ol>
      
      == Листки и код для семинаров ==
      
      * [https://drive.google.com/file/d/1Vm69QFV5XFgDozPM9hGp1teFdwjUdyLU/view?usp=sharing  Листок 1]
      
      * [https://drive.google.com/file/d/1xFLVoKjOGxooPTP66noHA0KFxosjFkkL/view?usp=sharing  Листок 2]
      
      == Домашние задания ==
      Домашние задания выдаются приблизительно раз в две недели; при выдаче каждого задания указывается срок его сдачи. Все задания письменные. Каждая задача оценивается  0, ½ или 1 баллом. Все задания в целом оцениваются числом:
      
      ДЗ = (сумма полученных баллов за все задачи) / (количество выданных задач).
      
      {| class="wikitable"
      |-
      ! Набор задач !! colspan="11" | Срок сдачи
      |-
      | || гр. Дашкова  || гр. Соколова
      |-
      |[https://drive.google.com/file/d/1MBSr_Ryb9Xw7HxYUU1vC6WfMHF_YJh9f/view?usp=sharing ДЗ 1] || 20.09 || 20.09
      |-
      |[https://drive.google.com/file/d/1IK0SZGj78veayMS6_1BS7lT9HncbNwTY/view?usp=sharing ДЗ 2] || 11.10 || 11.10
      |}
      
      '''Срок сдачи задания устанавливается семинаристом группы.'''
      
      '''Ссылка на классрум''': [https://classroom.google.com/c/OTM4MjAyNzk1MTda?cjc=xbblft6 https://classroom.google.com/c/OTM4MjAyNzk1MTda?cjc=xbblft6]
      
      == Контрольная работа ==
      Письменная Контрольная работа проводится в начале второго модуля. Допускается использование собственных записей студента и явно разрешенных локальных справочных систем. Каждая задача оценивается  0, ½ или 1 баллом. Контрольная оцениваются числом:
      
      КР = (сумма полученных баллов за все задачи) / (количество выданных задач).
      
      == Итоговый экзамен ==
      Письменный экзамен проводится в конце курса. Допускается использование собственных записей студента и явно разрешенных локальных справочных систем. Каждая задача оценивается  0, ¼, ½ , ¾ или 1 баллом. Экзамен оценивается числом:
      
      Э = (сумма полученных баллов за все задачи) / (количество выданных задач).
      
      == Индивидуальный проект ==
      При желании студенты согласовывают с семинаристом проект для индивидуальной работы. Также допускается работа в группах до трех человек. Проект представляет собой решение достаточно сложной задачи по программированию и предполагает самостоятельное получение недостающих сведений. Проекты должны быть сданы до 15-го декабря. За проект выставляется (дробная) оценка ПР от 0 до 1 балла.
      ==== Некоторые темы для проектов ====
      
      == Материалы ==
      
      [https://t.me/+0xll5HN3Y1k0ZDRi Группа слушателей курса в ТГ]
      
      [https://drive.google.com/drive/folders/1Ut4Tv4CkaMhC-8Mqxh4gK5WjaN3LkgUR?usp=sharing Материалы Е.В. Дашкова]
      
      ==== Базовые ресурсы ====
      
      [https://www.haskell.org/ Сайт языка]
      
      [https://docs.haskellstack.org/en/stable/README/ Haskell Tool Stack]
      
      [https://www.haskell.org/cabal/ Информация про Cabal]
      
      [https://www.haskell.org/hoogle/ Hoogle]
      
      [https://hackage.haskell.org/ Hackage]
      
      [http://hackage.haskell.org/package/base/ Стандартная библиотека языка Haskell на Hackage]
      
      ==== Книги и статьи ====
      
      [http://learnyouahaskell.com/ Learn You a Haskell for Great Good]
      
      [http://book.realworldhaskell.org/read/ Real World Haskell]
      
      [https://mathtrielhighschool.files.wordpress.com/2011/08/number-theory.pdf Basic Simple Type Theory]
      
      [https://disi.unitn.it/~bernardi/RSISE11/Papers/curry-howard.pdf Lectures on the Curry-Howard Isomorphism]
      
      [https://doc.lagout.org/programmation/Functional%20Programming/Chris_Okasaki-Purely_Functional_Data_Structures-Cambridge_University_Press%281998%29.pdf Purely Functional Data Structures.]
      
      '''Нет в открытом доступе'''
      
      [https://www.cs.nott.ac.uk/~pszgmh/pih.html Programming in Haskell by Graham Hutton]
      
      [https://mitpress.mit.edu/9780262660716/ Basic Category Theory for Computer Scientists by Benjamin C. Pierce]
      
      == Оценки ==
      
      Итоговая оценка получается так:
      
      Итог = ОКРУГЛ (2 * ПР + 2 * КР + 3 * ДЗ + 3 * Э).
      
      Округление производится к ближайшему целому, притом что полуцелые значения округляются вверх.