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

    @ZloyEngineer
    Сначала Lisp для погружения в ФП, желательно не оригинальный, а какой-нибудь из его диалектов, например, Scheme как, на мой взгляд, наиболее академичный. Потом Haskell для получения практических навыков.

    Господам же, рассуждающим о непрактичности Хаскеля, могу посоветовать отказаться от образа мышления "если я что-то не умею, то это сделать нельзя в принципе". Хаскель имеет свое практическое применение в реальной жизни не менее, чем, например, Python. Единственная проблема -- это достаточно высокий порог входа в язык. Высокий для канадского лесоруба, решившего закончить недельные курсы и стать высокооплачиваемым программистом. Что же касается программистов среднего уровня или чуть ниже, то для них Хаскель дает возможность писать быстрые, устойчивые программы, тратя существенно меньше времени, чем на той же Java. Я говорю о реальных программах, а не о задачках с олимпиад о раскладывании монеток по кучкам, о программах в 200+ строк на Хаскеле, что в переводе на С++/Java 2000+ строк.
    Ответ написан
    Комментировать
  • Копируется ли состояние при каждой операции над монадой состояния в Haskell?

    @ZloyEngineer
    Пример, что вы привели на питоне -- это stack, а не state.

    Монада State не предоставляет функциональности стека, она лишь предоставляет возможность хранения некой переменной. С точки зрения человека с головой набитой императивными тараканами это выглядит как полное копирование. Тем ни менее это не так и все зависит от программиста, нужно ли ему таскать за собой весь список или нет решает сам программист.

    Например, stack-пример, приведенный выше можно реализовать (используя классическую императивную реализацию) с помощью State монады так:

    import Control.Monad.State
    
    pop :: State [a] a
    pop = do
      h <- head <$> get
      modify tail
      return h
    
    push :: a -> State [a] ()
    push = modify . (:)
    
    print $ runState (mapM_ push [1 :: Int ,2,3,4]>>pop) []


    Тем ни менее ленивые вычисления с слабые на голову конструкторы сильно меняют логику выполнения программы, если смотреть с классической императивной позиции.
    Ответ написан
    Комментировать