Какие части реального мира Haskell теперь устарели или считаются плохой практикой?
в главе 19 Реальный Мир Хаскелл многие примеры теперь терпят неудачу из-за изменения Control.Exception.
узнать
Хаскелл Для Великого Добра, хотя это отличная книга, это гораздо более простой по сравнению с RWH.
может кто-нибудь, кто читал книгу раньше, пожалуйста дайте несколько советов о том, какие его части больше не актуальны? Особенно главы во второй половине книги, например, программное обеспечение транзакционной памяти, параллельное программирование, Программирование сокетов и т. д.
EDIT: речь идет об издании книги, опубликованной в декабре 2008 года, которая является единственным известным изданием на сегодняшний день (ноябрь 2017 года)
1 ответ:
главная проблема RWH
он старый. RWH был написан в то время, когда использовалась версия 6.8 GHC. 6.8 используется базовая версия 3.0.x. x. 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была изменить из-за Складной-Проходимый-Предложение. Многие другие функции, такие какfoldr,foldlи многие другие, которые ранее были определены только для[a]наPreludeбыли заменены на более общиеFoldable t => t aварианты.Глава 11. Тестирование и обеспечение качества
С Haskell-platform 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 теперь генерирует предупреждения, когда определения конфликтуют с Аппликативно-Монадное Предложение (усилитель).посмотреть 7.8.1 примечания к выпуску.
The
State/Writer/Readerмонадына встанет ли, пожалуйста, настоящая государственная монада? раздел, утверждают авторы
чтобы определить a
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()следует использовать сfree(),newСdelete,allocateС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 и repa полностью отсутствуют в RWH.
Глава 26. Расширенный дизайн библиотеки: создание Блум-фильтра
как и в других главах, общие рекомендации библиотеки дизайна по-прежнему хорошо написаны и актуальны. Однако, из-за некоторых изменений (?) по поводу
ST, результат больше не может быть скомпилирован.Глава 27. Сетевое программирование
это все еще в основном до настоящего времени. В конце концов, Сетевое программирование не так легко меняется. Однако в коде используются устаревшие функции
bindSocketиsClose, который должен быть заменен наbindиclose(предпочтительно через квалифицированные импорт). Имейте в виду, что это очень низкий уровень, вы можете использовать более специализированный высокий уровень библиотека.приложение A. установка библиотек GHC и Haskell
GHC 6.8 была последней версией до того, как была представлена платформа Haskell. Поэтому приложение говорит вам, чтобы получить GHC и Cabal вручную. Нет. Вместо этого, следуйте инструкциям на haskell.org страница скачать.
кроме того, приложение не говорит вам о Cabal sandboxes, которые были введены в Кабал 1.18 и освободить вас от зависимость ад. И конечно,
stackполностью отсутствует.отсутствует контент
некоторые темы вообще не обсуждаются в RWH. Это включает в себя потоковые библиотеки, такие как труб и проводник, а также объективы.
есть несколько ресурсов по этим темам, но вот некоторые ссылки на введение, чтобы дать вам представление о том, что они. Кроме того, если вы хотите использовать векторы, используйте
vectorsпакета.
Control.ApplicativeRWH использует
Control.Applicative' s(<$>)в нескольких точках, но не объясняетControl.Applicativeна всех. Лях и Typeclassopedia содержать разделыApplicative. Учитывая, чтоApplicative- это суперклассMonad(см. выше), рекомендуется выучить этот класс наизусть.кроме того, несколько операторов
Control.Applicative(и сам класс) теперь являются частью элементPrelude, поэтому убедитесь, что ваши операторы не столкновение с<$>,<*>и другие.объективы
- видео Эдвард Kmett (автор
lens)- видео Адама Гандри "линзы: композиционный доступ к данным и манипуляции"
- введение и учебник Якуба Арнольда
потокового библиотеки
- обзор трубопровода Майклом Снойманом (автор
conduit)- трубы учебник Габриэль Гонсалес (автор
pipes, входящего вpipesпакет)инструмент
- версия 1.18 Cabal, которая представила песочницах
stack, кросс-платформенная программа для разработки на Haskell проектыghc-mod, бэкэнд для vim, emacs, Sublime Text и других редакторовновые / отсутствующие языковые расширения и изменения GHC
- полиморфизм типа времени выполнения (
:i ($)изменилось потрясающе)-XTypeInType-XDataKinds-XGADT-XRankNTypes-XGenericNewtypeDeriving-XDeriveFunctor- любое другое расширение, которое произошло после 6.6
Comments