Какие части Real World Haskell сейчас устарели или считаются плохой практикой?

107

В главе 19 Real World Haskell многие примеры теперь терпят неудачу из-за изменения Control.Exception.

Это заставляет меня думать, что, возможно, некоторые из материалов в этой книге на самом деле устарели и не стоит больше изучать, в конце концов, прошло уже 6 лет. Моя единственная другая ссылка - Learn You a Haskell For Great Good , хотя это отличная книга, она гораздо более проста по сравнению с RWH.

Может ли кто-нибудь, кто читал эту книгу раньше, дать совет, какие из ее частей больше не актуальны? Особенно главы во второй половине книги, например, программная транзакционная память, параллельное программирование, программирование сокетов и т. Д.

РЕДАКТИРОВАТЬ: Речь идет об издании книги, опубликованной в декабре 2008 г., которая является единственным известным изданием на сегодняшний день (ноябрь 2017 г.).

качаться
источник
2
AFAIK онлайн-версия Real World Haskell будет время от времени обновляться. Возможно, вы найдете более полезные материалы в Викибуке Haskell .
Vektorweg
@Vektorweg До сих пор большая часть работы над Викибуком была сделана во вводных главах (которые примерно охватывают ту же тему, что и уровень LYAH, хотя и с другой точки зрения) и в освещении более продвинутых тем теории и систем типов. Для прикладных задач, как показано в последующих главах RWH swang, RWH на данный момент является лучшим выбором; хотя, как участник Викибука, я надеюсь, что со временем это изменится :)
duplode
1
@Vektorweg: Существенных различий между печатной и онлайн-версией я не заметил. Кроме того, онлайн-версия, похоже, вообще не обновляется, глава о фильтре цветения давно не работает (по крайней мере, 2009). При этом Wikibooks, ура :).
Зета
1
@Swang Обратите внимание, что даже Learn You a Haskell содержит устаревшие вещи, которые теперь Monadявляются подклассом Applicative.
jub0bs
1
Пожалуйста, укажите издание книги. В общем, всегда упоминайте версию , платформу , ОС , выпуск и т. Д., Когда говорите о продукте!
Наваз

Ответы:

137

Главный выпуск RWH

Это старый. RWH был написан во время использования версии 6.8 GHC. 6.8 использовала базовую версию 3.0.xx 6.10.1 уже использовала 4.0.0.0, которая внесла много изменений . И это просто скачок с 6,8 до 6,10. Текущая версия GHC - 7.10. Изменены монады. Там в настоящее время дискуссии , чтобы удалить returnизMonad , так что Monadэкземпляр в реальном мире Haskell действительно будет синхронизирован с реальным миром.

Тем не менее, это все еще полезный ресурс для общих рекомендаций. Но учтите, что многие библиотеки изменились с момента его выпуска.

Во время чтения RWH вы можете прочитать «Что бы я хотел знать при изучении Haskell» Стивена Дила . Это дает дополнительную информацию, но имейте в виду, что некоторые разделы не совсем удобны для новичков.

Основные пометки

  • Прочтите комментарии. Обычно они содержат информацию о том, актуален ли данный параграф / раздел и / или работает ли он.
  • Прочтите документацию по библиотекам / функциям, которые вы хотите использовать. Даже если вы ленивы, знайте хотя бы типы.

Замечания к главам

Это всего лишь краткий обзор некоторых вещей, которые я заметил, читая RWH. Наверное, неполный.

Глава 2. Типы и функции по сравнению с FTP

Начиная с GHC 7.10 .

Тип nullбыл изменен в связи с предложением Foldable-Traversable-Proposal . Многие другие функции, такие как foldr, foldlи многие другие, которые ранее были определены только [a]в Prelude, были заменены более общими Foldable t => t aвариантами.

Глава 11. Тестирование и обеспечение качества

Начиная с Haskell-платформы 2010 или конца 2008 года.

Хотя об этом упоминается в сноске , библиотека QuickCheck во многом изменилась с версии 1 на версию 2. Например, generateтеперь используется Gen aвместо StdGen, а функциональность старой generateнаходится в Test.QuickCheck.Gen.unGen.

В случае сомнений проверьте документацию .

Глава 14. Монады и Глава 15. Программирование с помощью монад.

Взлом кода: Applicative m => Monad m

Начиная с GHC 7.10, Applicativeэто суперкласс того Monad, чего не планировалось в 2007 году.

В GHC 7.10 Applicativeон станет суперклассом Monad, потенциально нарушающим множество пользовательского кода. Чтобы упростить этот переход, GHC теперь генерирует предупреждения, когда определения конфликтуют с предложением Applicative-Monad ( AMP ).

См. Примечания к выпуску 7.8.1 .

В State/ Writer/ Readerмонады

В « Будет ли настоящая государственная монада», встаньте, пожалуйста? раздел, утверждают авторы

Чтобы определить Monadэкземпляр, мы должны предоставить соответствующий конструктор типа, а также определения для (>>=)и return. Это подводит нас к реальному определению State.

-- file: ch14/State.hs
newtype State s a = State
    runState :: s -> (a, s)
}

Это уже не так, потому что Stateи его друзья теперь реализованы через

type State  s = StateT  s Identity
type Writer w = WriterT w Identity
type Reader r = ReaderT r Identity

Итак, они определены их преобразователем монад.

Глава 17. Взаимодействие с C: FFI

В целом глава хороша , но, как можно прочитать в комментариях или в блоге Юраса Шумовича , часть финализатора в следующем коде - плохая практика:

pcre_ptr <- c_pcre_compile pattern (combineOptions flags) errptr erroffset nullPtr
if pcre_ptr == nullPtr
    then do
        err <- peekCString =<< peek errptr
        return (Left err)
    else do
        reg <- newForeignPtr finalizerFree pcre_ptr -- release with free()
        return (Right (Regex reg str))

Поскольку malloc()следует использовать with free(), newwith delete, allocatewith deallocate, всегда следует использовать правильную функцию.

TL; DR Вы всегда должны освобождать память с тем же распределителем, который выделил ее для вас.

Если внешняя функция выделяет память, вы также должны использовать соответствующую функцию освобождения.

Глава 19. Обработка ошибок

Обработка ошибок полностью изменилась с 6.8 на 6.10, но вы это уже заметили. Лучше прочтите документацию .

Глава 22. Расширенный пример: программирование веб-клиента

Некоторые примеры кажутся сломанными. Также доступны другие библиотеки HTTP.

Глава 25. Профилирование и оптимизация

Общие методы профилирования остались прежними, и пример (см. Ниже) является отличным примером проблем, которые могут возникнуть в вашей программе. Но в RWH отсутствует многопоточное профилирование, например, через ThreadScope. Кроме того, насколько мне известно, ленивый ввод-вывод не рассматривается на протяжении всей книги.

mean :: [Double] -> Double
mean xs = sum xs / fromIntegral (length xs)

Глава 24 и Глава 28 (Параллельное и параллельное программирование и STM)

Хотя Глава 24. Параллельное и многоядерное программирование и Глава 28. Программная транзакционная память по-прежнему актуальны, книга Саймона Марлоу « Параллельное и параллельное программирование в Haskell» посвящена исключительно параллельному и параллельному программированию и вышла совсем недавно (2013 г.). Программирование и восстановление GPU полностью отсутствуют в RWH.

Глава 26. Расширенный дизайн библиотеки: создание фильтра Блума

Как и в случае с другими главами, общие руководящие принципы библиотеки дизайна по-прежнему хорошо написаны и актуальны. Однако из-за некоторых изменений (?) ST, Результат больше не может быть скомпилирован.

Глава 27. Сетевое программирование

Он все еще в основном обновлен. В конце концов, сетевое программирование не так легко изменить. Однако в коде используются устаревшие функции bindSocketи sClose, которые следует заменить на bindи close(желательно через квалифицированный импорт). Имейте в виду, что он очень низкоуровневый, вы можете использовать более специализированную библиотеку высокого уровня.

Приложение A. Установка библиотек GHC и Haskell

GHC 6.8 была последней версией до того, как была представлена ​​платформа Haskell. Таким образом, в приложении говорится, что вам нужно получить GHC и Cabal вручную. Не надо. Вместо этого следуйте инструкциям на странице загрузки haskell.org .

Кроме того, в приложении не рассказывается о песочницах Cabal, которые были введены в Cabal 1.18 и избавляют вас от ада зависимости . И, конечно, stackотсутствует полностью.

Отсутствующий контент

Некоторые темы вообще не обсуждаются в RWH. Это включает в себя потоковое библиотеки , такие как трубы и трубопровода , а также линзы .

Есть несколько ресурсов по этим темам, но вот несколько ссылок на вводные, чтобы дать вам представление, о чем они. Также, если вы хотите использовать векторы, используйте vectorsпакет.

Control.Applicative

RWH использует Control.Applicative's (<$>)в нескольких местах, но ничего не объясняет Control.Applicative. LYAH и Typeclassopedia содержат разделы по Applicative. Учитывая, что Applicativeэто суперкласс Monad(см. Выше), рекомендуется выучить этот класс наизусть.

Кроме того, некоторые операторы Control.Applicative(и сам класс типов) теперь частью Prelude, поэтому убедитесь , что ваши операторы не сталкиваются с <$>, <*>и другие.

Линзы

Потоковые библиотеки

Инструменты

  • версия 1.18 Cabal, в которой появились песочницы
  • stack, кроссплатформенная программа для разработки проектов на Haskell
  • ghc-mod, бэкэнд для vim, emacs, Sublime Text и других редакторов

Новые / отсутствующие языковые расширения и изменения GHC

  • полиморфизм типа времени выполнения ( :i ($)сильно изменился)
  • -XTypeInType
  • -XDataKinds
  • -XGADT
  • -XRankNTypes
  • -XGenericNewtypeDeriving
  • -XDeriveFunctor
  • любое другое расширение, которое произошло после 6.6
Zeta
источник
спасибо, это именно то, что я искал :), вы напоминаете мне о проблеме с монадой состояния, у нее больше нет конструктора значения состояния, мне пришлось немного почесать голову, чтобы понять, когда я ее читал.
swang
@swang: Он еще далек от завершения. Может быть, Брайан или Дон знают больше об измененных функциях. В любом случае общие принципы остаются в силе.
Зета
1
Для сетей высокого уровня я предпочитаю простую сеть .
Lambda Fairy
Существует взаимосвязь между «преобразователями», сопрограммами и конвейерами потоковых библиотек.
CMCDragonkai
Считается ли использование HDBC устаревшим?
Янус