Ответы пользователя по тегу Функциональное программирование
  • Зачем использовать functor?

    Функтор, в контексте функионального программирования — это интерфейс (или тайпкласс), который может быть реализован для разных типов. Чтобы тип мог имплементировать функтор, он должен иметь кайнд * -> * (то есть это должен быть дженерик с одним параметром) и для него должна быть реализована функция map:

    map :: Functor f => (a -> b) -> (f a -> f b)

    Имя и сигнатура могут отличаться в зависимости от реализации, например в Haskell эта функция называется fmap, а в Fantasy Land сигнатура выглядит так:

    map :: Functor f => f a ~> (a -> b) -> f b

    Также для функции/метода map должны выполняться определённые законы, не буду их копировать сюда, просто оставлю ссылку: https://github.com/fantasyland/fantasy-land#functor

    Несколько примеров функторов:
    • Arraymap применяет функцию к каждому элементу массива.
    • Futuremap применяет функцию к значению когда оно зарезолвится.
    • Maybemap применяет функцию к значению, если оно существует, иначе возвращает Nothing.
    Ответ написан
    1 комментарий
  • Какие книги почитать по функциональному программированию?

    Начинать изучение функциональщины, я считаю, стоит с Haskell. Функциональный код можно писать и на Scala, и даже на JS, но Haskell с точки зрения изучения ФП хорош тем, что он навязывает функциональный стиль, так что не будет соблазна решить задачу в привычном императивном стиле.

    Начать можно с лекций Дениса Москвина по лямбда-исчислению:

    1. https://youtu.be/7BPQ-gpXKt4
    2. https://youtu.be/nyulPOcDLGM
    3. https://youtu.be/S-mqZrmUUqU


    Конкретно по Haskell могу посоветовать книгу Антона Холомьёва.
    Ответ написан
    3 комментария
  • С чего начать в функциональном программировании на js?

    Еще я понял, что ramda это самая близкая к фп библиотека , а другие что то типо либ общего назначения.

    Это так. В Ramda все функции каррированы из коробки, аргументы передаются в удобном для функционального стиля порядке, функции не мутируют данные, а создают новые копии.

    Подскажите с какой библиотеки лучше начать.

    Определённо, с Ramda.

    А может Elm?

    Если уже знаете JS то проще будет начать с Ramda. Хотя Elm жёстче в плане соблюдения правил функционального подхода.

    Еще такая проблема , что я обычно читаю документацию с плагином google translate и нормально понимаю смысл, но с фп у меня так не выходит (пытался читать документацию ramda и underscore). Может сталкивались с переводами документаций или их подобиями?

    Учите английский. Без него изучать программирование в любом случае затруднительно.

    Алсо, маст хэв для ФП в JS - Fantasy Land (можно добавить ещё Static Land). Но это следующий уровень, после того как освоите основные приёмы ФП и прочитаете пару статей о монадах, функторах и т.д.
    Ответ написан
    Комментировать
  • Почему бы не хранить состояние внутри функции?

    В сущности, если функция чистая, то не важно что там творится внутри. Если через циклы проще или производительнее — пишите через циклы. Главное чтобы не было побочных эфектов (в том числе чтения/изменения глобального состояния). Да, если на 100% следовать принципам ФП, то от изменяемого состояния нужно отказаться вообще, но при программировании на императивных языках никто так не делает по ряду причин, среди которых отсутствие в таких языках синтаксического сахара, привычного функциональщикам, а также возможные проблемы с производительностью (речь идёт в основном как раз про использование рекурсии вместо циклов, как в Вашем случае).
    Ответ написан
    Комментировать
  • Какова область применения Lisp/Clojure/Scheme?

    Какова область применения Lisp/Clojure/Scheme?

    В общем-то это всё языки общего назначения, которые могут использоваться там же где и Python или Java, например. Единственное, что я бы выделил — написание EDSL (встраиваемых предметно-специфичных языков). Пример: https://github.com/tonsky/datascript.

    В чем их преимущества над ООП языками?

    Лиспы поддерживают ООП, вопрос некорректный.

    все объекты в функциональных языках передаются по значению

    Кто Вам такую чушь сказал? И да, лиспы не более функциональны, чем какой-нибудь JavaScript.

    В каких случаях лучше не использовать ФП?

    Смотря что понимать под ФП. Лямбды, ФВП, чистые функции стоит использовать всегда. Рекурсивные функции — нежелательно, если язык не поддерживает TCO (хотя некоторые скажут что преждевременная оптимизация — корень всех зол). Всякие монады и функторы — по ситуации, только не говорите никому что это монады. Вон Promise всё JS-сообщество использует, а было бы написано в доке, что Promise — монада, никто бы и смотреть не стал :)
    Ответ написан
    2 комментария