Какие части реального мира Haskell теперь устарели или считаются плохой практикой?



в главе 19 Реальный Мир Хаскелл многие примеры теперь терпят неудачу из-за изменения Control.Exception.



узнать
Хаскелл Для Великого Добра, хотя это отличная книга, это гораздо более простой по сравнению с RWH.

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



EDIT: речь идет об издании книги, опубликованной в декабре 2008 года, которая является единственным известным изданием на сегодняшний день (ноябрь 2017 года)

564   1  

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.Applicative

RWH использует Control.Applicative ' s (<$>) в нескольких точках, но не объясняет Control.Applicative на всех. Лях и 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

Comments

    Ничего не найдено.