Главный выпуск 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
вариантами.
Начиная с 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
Итак, они определены их преобразователем монад.
В целом глава хороша , но, как можно прочитать в комментариях или в блоге Юраса Шумовича , часть финализатора в следующем коде - плохая практика:
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()
, new
with delete
, allocate
with deallocate
, всегда следует использовать правильную функцию.
TL; DR Вы всегда должны освобождать память с тем же распределителем, который выделил ее для вас.
Если внешняя функция выделяет память, вы также должны использовать соответствующую функцию освобождения.
Обработка ошибок полностью изменилась с 6.8 на 6.10, но вы это уже заметили. Лучше прочтите документацию .
Некоторые примеры кажутся сломанными. Также доступны другие библиотеки HTTP.
Общие методы профилирования остались прежними, и пример (см. Ниже) является отличным примером проблем, которые могут возникнуть в вашей программе. Но в RWH отсутствует многопоточное профилирование, например, через ThreadScope. Кроме того, насколько мне известно, ленивый ввод-вывод не рассматривается на протяжении всей книги.
mean :: [Double] -> Double
mean xs = sum xs / fromIntegral (length xs)
Глава 24 и Глава 28 (Параллельное и параллельное программирование и STM)
Хотя Глава 24. Параллельное и многоядерное программирование и Глава 28. Программная транзакционная память по-прежнему актуальны, книга Саймона Марлоу « Параллельное и параллельное программирование в Haskell» посвящена исключительно параллельному и параллельному программированию и вышла совсем недавно (2013 г.). Программирование и восстановление GPU полностью отсутствуют в RWH.
Как и в случае с другими главами, общие руководящие принципы библиотеки дизайна по-прежнему хорошо написаны и актуальны. Однако из-за некоторых изменений (?) ST
, Результат больше не может быть скомпилирован.
Глава 27. Сетевое программирование
Он все еще в основном обновлен. В конце концов, сетевое программирование не так легко изменить. Однако в коде используются устаревшие функции bindSocket
и sClose
, которые следует заменить на bind
и close
(желательно через квалифицированный импорт). Имейте в виду, что он очень низкоуровневый, вы можете использовать более специализированную библиотеку высокого уровня.
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