Які частини реального світу Haskell зараз застаріли або вважаються поганою практикою?


107

У главі 19 реального світу Haskell багато прикладів зараз не вдалося через змінуControl.Exception .

Це змушує мене думати, що, можливо, деякі речі цієї книги насправді застаріли і більше не варто їх вивчати, адже минуло 6 років. Моя інша довідка - Learn You a Haskell For Great Good , хоча це чудова книга, вона набагато основніша порівняно з RWH.

Чи може кожен, хто прочитав книгу раніше, будь-ласка, дасть поради, які її частини більше не стосуються? Особливо розділи другої половини книги, наприклад, транзакційна пам'ять програмного забезпечення, одночасне програмування, програмування сокетів тощо.

EDIT: Мова йде про видання книги, яка вийшла друком грудня 2008 року, що є єдиним відомим на сьогодні виданням (листопад 2017 р.)


2
AFAIK онлайн-версія Real World Haskell час від часу буде оновлюватися. Можливо, ви знайдете більше корисних речей у Вісник Haskell .
Vektorweg

@Vektorweg Більшість робіт над Wikibook до цього часу було виконано у вступних розділах (які приблизно охоплюють той же грунт, що і рівень LYAH, хоча і з різним рівнем) та висвітленні більш прогресивних теорій та типів системних тем. Що стосується прикладних питань, як видно з пізніших розділів RWH, про які йдеться, «RWH - це кращий вибір на даний момент; хоча я, як учасник Wikibook, сподіваюся, що з часом зміниться :)
дублод

1
@Vektorweg: Я не помітив суттєвих відмінностей між друкованою та інтернет-версією. Крім того, інтернет-версія, схоже, не оновлюється взагалі, розділ фільтра цвітіння давно порушено (принаймні, 2009 р.). Це, як кажуть, Wikibooks, так :).
Зета

1
@Swang Зауважте, що навіть Learn You 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був змінений в зв'язку з складаний-прохідними-пропозиціями . Багато інших функцій, таких як 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 тепер генерує попередження, коли визначення суперечать пропозиції-додатку 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()слід використовувати free(), newз delete, allocateз deallocate, завжди слід використовувати правильну функцію.

TL; DR Ви завжди повинні звільняти пам'ять тим самим розподільником, який виділив її для вас.

Якщо іноземна функція виділяє пам'ять, ви також повинні використовувати супутню функцію делокації.

Глава 19. Помилка обробки

Помилка керування повністю змінилася з 6,8 до 6,10, але ви це вже помітили. Краще прочитайте документацію .

Розділ 22. Розширений приклад: Програмування веб-клієнтів

Деякі приклади здаються зламаними. Також доступні інші бібліотеки HTTP.

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

Загальні методи профілювання залишаються однаковими, і приклад (див. Нижче) - чудовий приклад для проблем, які можуть виникнути у вашій програмі. Але в RWH відсутнє багатопотокове профілювання, наприклад, через ThreadScope. Крім того, наскільки я знаю, лінивий IO не стосується всієї книги.

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 (переважно з допомогою кваліфікованого імпорту). Майте на увазі, що це дуже низький рівень, можливо, ви хочете використовувати більш спеціалізовану бібліотеку високого рівня.

Додаток А. Встановлення бібліотек GHC та Haskell

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

спасибі, це саме те, що я був після :), ви нагадуєте мені про питання монади держави, вона більше не має конструктора "Державна цінність", взяла мене за чухати голову, щоб зрозуміти, коли я її читала.
заплив

@swang: Це ще далеко не завершено. Можливо, Брайан або Дон знають більше про змінені функції. Так чи інакше, загальні вказівки все-таки дотримуються.
Зета

1
Для мереж на високому рівні я віддаю перевагу простоті мережі .
Фея лямбда

Існує взаємозв'язок між "перетворювачами", супровідними програмами та потоковими трубами бібліотек, каналами.
CMCDragonkai

Чи вважається використання HDBC застарілим?
Янус Троельсен
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.