Основний випуск 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
був змінений в зв'язку з складаний-прохідними-пропозиціями . Багато інших функцій, таких як 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 тепер генерує попередження, коли визначення суперечать пропозиції-додатку 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()
слід використовувати free()
, new
з delete
, allocate
з deallocate
, завжди слід використовувати правильну функцію.
TL; DR Ви завжди повинні звільняти пам'ять тим самим розподільником, який виділив її для вас.
Якщо іноземна функція виділяє пам'ять, ви також повинні використовувати супутню функцію делокації.
Помилка керування повністю змінилася з 6,8 до 6,10, але ви це вже помітили. Краще прочитайте документацію .
Деякі приклади здаються зламаними. Також доступні інші бібліотеки HTTP.
Загальні методи профілювання залишаються однаковими, і приклад (див. Нижче) - чудовий приклад для проблем, які можуть виникнути у вашій програмі. Але в RWH відсутнє багатопотокове профілювання, наприклад, через ThreadScope. Крім того, наскільки я знаю, лінивий IO не стосується всієї книги.
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 .
Крім того, у додатку не йдеться про песочниці Кабала, які були введені в Кабалі 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