Które części Real World Haskell są teraz przestarzałe lub uważane za złe praktyki?

107

W rozdziale 19 Real World Haskell wiele przykładów zawodzi teraz z powodu zmiany Control.Exception.

To sprawia, że ​​myślę, że może niektóre rzeczy w tej książce są przestarzałe i nie warto ich już studiować, w końcu minęło już 6 lat. Moje jedyne inne odniesienie to Learn You a Haskell For Great Good , choć jest to świetna książka, jest o wiele bardziej podstawowa w porównaniu z RWH.

Czy ktoś, kto przeczytał książkę wcześniej, może udzielić porady, które jej części nie są już aktualne? Zwłaszcza rozdziały drugiej połowy książki, na przykład pamięć transakcyjna oprogramowania, programowanie współbieżne, programowanie gniazd itp.

EDYCJA: Chodzi o wydanie książki opublikowanej w grudniu 2008 r., Która jest jedynym znanym wydaniem na dzień dzisiejszy (listopad 2017)

Swang
źródło
2
AFAIK wersja online Real World Haskell będzie od czasu do czasu aktualizowana. Może znajdziesz więcej przydatnych rzeczy w Haskell Wikibook .
Vektorweg
@Vektorweg Większość dotychczasowych prac nad Wikibookiem została wykonana w rozdziałach wprowadzających (które z grubsza obejmują ten sam obszar co poziom LYAH, ale z innym podejściem) oraz w zakresie bardziej zaawansowanych zagadnień teorii i systemów czcionek. W zastosowanych kwestiach, o których mowa w dalszych rozdziałach RWH swang, na razie lepszym wyborem jest RWH; chociaż, jako współpracownik Wikibook, mam nadzieję, że w końcu się to zmieni :)
duplode
1
@Vektorweg: Nie zauważyłem znaczących różnic między wersją drukowaną a wersją online. Wydaje się, że wersja online nie jest w ogóle aktualizowana, rozdział dotyczący filtrów kwitnienia był zepsuty przez długi czas (przynajmniej 2009). Biorąc to pod uwagę, Wikibooks, yay :).
Zeta
1
@Swang Zauważ, że nawet Learn You a Haskell zawiera przestarzałe rzeczy, które teraz Monadsą podklasą Applicative.
jub0bs
1
Proszę wspomnieć o wydaniu książki. Ogólnie mówiąc o produkcie , zawsze wspominaj o wersji , platformie , systemie operacyjnym , edycji itp.
Nawaz

Odpowiedzi:

137

Główny numer RWH

To jest stare. RWH został napisany w czasie, gdy używana była wersja 6.8 GHC. 6.8 korzystał z wersji podstawowej 3.0.xx 6.10.1 już używanej 4.0.0.0, co wprowadziło wiele zmian . A to tylko skok z 6,8 do 6,10. Aktualna wersja GHC to 7.10. Monady zostały zmienione. Jest obecnie dyskusja w celu usunięcia returnzMonad , więc Monadinstancja w Real World Haskell naprawdę będzie zsynchronizowany z prawdziwego świata.

Mimo to jest to nadal przydatne źródło ogólnych wskazówek. Należy jednak pamiętać, że wiele bibliotek zmieniło się od czasu jego wydania.

Coś, co możesz przeczytać podczas czytania RWH, to „What I Wish I Knew When Learning Haskell” Stephena Diehla . Zapewnia dodatkowe informacje, ale pamiętaj, że niektóre sekcje nie są przyjazne dla nowicjuszy.

Uwagi ogólne

  • Przeczytaj komentarze. Zwykle zawierają informację, czy dany akapit / sekcja jest nadal aktualny i / lub działa.
  • Przeczytaj dokumentację bibliotek / funkcji, których chcesz użyć. Nawet jeśli jesteś leniwy, poznaj przynajmniej typy.

Uwagi do rozdziałów

To tylko krótki przegląd niektórych rzeczy, które zauważyłem podczas czytania RWH. Prawdopodobnie jest niekompletny.

Rozdział 2. Typy i funkcje a FTP

Od GHC 7.10 .

Typ nullzostał zmieniony z powodu propozycji Foldable-Traversable-Propozycja . Wiele innych funkcji, takich jak foldr, foldli wiele innych, które zostały wcześniej zdefiniowane tylko dla [a]w Preludezostały zastąpione bardziej ogólnegoFoldable t => t a wariantów.

Rozdział 11. Testowanie i zapewnienie jakości

Od platformy Haskell 2010 lub pod koniec 2008 roku.

Chociaż wspomniano o tym w przypisie , biblioteka QuickCheck zmieniła się pod wieloma względami z wersji 1 do wersji 2. Na przykład generateteraz używa Gen azamiast StdGen, a funkcjonalność starej generatejest w Test.QuickCheck.Gen.unGen.

W razie wątpliwości sprawdź dokumentację .

Rozdział 14. Monady i rozdział 15. Programowanie z monadami

Łamanie kodu: Applicative m => Monad m

Od wersji GHC 7.10 Applicativejest teraz nadklasą Monadczegoś, co nie było planowane w 2007 roku.

W GHC 7.10 Applicativestanie się nadklasą Monad, potencjalnie zrywając dużą część kodu użytkownika. Aby ułatwić to przejście, GHC generuje teraz ostrzeżenia, gdy definicje są sprzeczne z propozycją Applicative-Monad ( AMP ).

Zobacz uwagi do wydania 7.8.1 .

W State/ Writer/ Readermonady

W Czy monada z prawdziwego stanu może wstać? - twierdzą autorzy

Aby zdefiniować Monadinstancję, musimy zapewnić odpowiedni konstruktor typu oraz definicje dla (>>=)i return. To prowadzi nas do prawdziwej definicji State.

-- file: ch14/State.hs
newtype State s a = State
    runState :: s -> (a, s)
}

To już nie prawda, ponieważ Statei jego przyjaciele są teraz zaimplementowani za pośrednictwem

type State  s = StateT  s Identity
type Writer w = WriterT w Identity
type Reader r = ReaderT r Identity

Są więc zdefiniowane przez transformator monadowy.

Rozdział 17. Współpraca z C: FFI

Cały rozdział jest w porządku, ale jak można przeczytać w komentarzach lub na blogu Yurasa Shumovicha , finalizująca część w poniższym kodzie jest złą praktyką:

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))

Podobnie jak w malloc()przypadku free(), newwith delete, allocatewith deallocate, należy zawsze używać poprawnej funkcji.

TL; DR Zawsze powinieneś zwolnić pamięć za pomocą tego samego alokatora, który ją przydzielił.

Jeśli obca funkcja alokuje pamięć, należy również użyć towarzyszącej funkcji zwalniania.

Rozdział 19. Obsługa błędów

Obsługa błędów zmieniła się całkowicie z 6.8 na 6.10, ale już to zauważyłeś. Lepiej przeczytaj dokumentację .

Rozdział 22. Rozszerzony przykład: programowanie klienta WWW

Niektóre przykłady wydają się być zepsute. Dostępne są również inne biblioteki HTTP.

Rozdział 25. Profilowanie i optymalizacja

Ogólne techniki profilowania są nadal takie same, a przykład (patrz poniżej) jest świetnym studium przypadku problemów, które mogą wystąpić w Twoim programie. Ale w RWH brakuje profilowania wielowątkowego, np. Przez ThreadScope. O ile wiem, leniwe IO nie dotyczy całej książki.

mean :: [Double] -> Double
mean xs = sum xs / fromIntegral (length xs)

Rozdział 24 i Rozdział 28 (Programowanie współbieżne i równoległe oraz STM)

Podczas gdy Rozdział 24. Programowanie współbieżne i wielordzeniowe oraz Rozdział 28. Pamięć transakcyjna oprogramowania są nadal aktualne, książka Simona Marlowa Parallel and Concurrent Programming in Haskell skupia się wyłącznie na programowaniu współbieżnym i równoległym i jest całkiem nowa (2013). W RWH całkowicie brakuje programowania i naprawy GPU.

Rozdział 26. Zaawansowany projekt biblioteki: budowanie filtra Blooma

Podobnie jak w przypadku innych rozdziałów, ogólne wytyczne dotyczące biblioteki projektów są nadal dobrze napisane i aktualne. Jednak ze względu na pewne zmiany (?) Dotyczące STwyników nie można już skompilować.

Rozdział 27. Programowanie sieciowe

Wciąż jest w większości aktualny. W końcu programowanie sieciowe nie zmienia się tak łatwo. Jednak kod używa przestarzałych funkcji bindSocketi sClose, które powinny zostać zastąpione przez bindi close(najlepiej za pośrednictwem kwalifikowanego importu). Pamiętaj, że jest to bardzo niski poziom, możesz chcieć użyć bardziej wyspecjalizowanej biblioteki wysokiego poziomu.

Dodatek A. Instalowanie bibliotek GHC i Haskell

GHC 6.8 było ostatnią wersją przed wprowadzeniem platformy Haskell. Dlatego dodatek mówi, aby ręcznie uzyskać GHC i Cabal. Nie. Zamiast tego postępuj zgodnie z instrukcjami na stronie pobierania haskell.org .

Dodatek nie mówi również o piaskownicach Cabal, które zostały wprowadzone w wersji Cabal 1.18 i uwolnią Cię od piekła zależności . I oczywiście stackcałkowicie go brakuje.

Brakująca treść

Niektóre tematy nie są w ogóle poruszane w RWH. Obejmuje to biblioteki strumieniowe, takie jak rury i kanały , a także soczewki .

Istnieje kilka zasobów dotyczących tych tematów, ale poniżej znajdują się łącza do wstępów, które pomogą Ci zorientować się, czego dotyczą. Ponadto, jeśli chcesz używać wektorów, użyj vectorspakietu.

Control.Applicative

RWH zastosowania Control.Applicative„s (<$>)na kilka punktów, ale nie wyjaśnia Control.Applicativewcale. LYAH i Typeklasopedia zawierają sekcje dotyczące Applicative. Biorąc pod uwagę, że Applicativejest to nadklasaMonad (patrz wyżej), zaleca się nauczenie tej klasy na pamięć.

Ponadto kilku operatorów Control.Applicative(i sama typeclass) są teraz częścią Prelude, więc upewnij się, że operatorzy nie kolidować z <$>, <*>i innych.

Soczewki

Biblioteki strumieniowe

Obróbka

  • wersja 1.18 Cabal, która wprowadziła piaskownice
  • stack, wieloplatformowy program do tworzenia projektów Haskell
  • ghc-mod, zaplecze dla vim, emacs, Sublime Text i innych edytorów

Nowe / brakujące rozszerzenia językowe i zmiany w GHC

  • polimorfizm typu uruchomieniowego ( :i ($)ogromnie się zmienił)
  • -XTypeInType
  • -XDataKinds
  • -XGADT
  • -XRankNTypes
  • -XGenericNewtypeDeriving
  • -XDeriveFunctor
  • wszelkie inne rozszerzenia, które miały miejsce po 6.6
Zeta
źródło
dzięki, właśnie o to mi chodziło :), przypominasz mi kwestię monady stanu, nie ma już konstruktora wartości stanu, podrapałem mnie po głowie, żeby się dowiedzieć, kiedy to czytałem.
zmienił się
@swang: To wciąż jest dalekie od ukończenia. Może Bryan lub Don wiedzą więcej o zmienionych funkcjach. Tak czy inaczej, ogólne wytyczne są nadal aktualne.
Zeta
1
W przypadku sieci wysokiego poziomu preferuję prostotę sieci .
Lambda Fairy
Istnieje związek między „przetwornikami”, procesami i bibliotekami strumieniowymi, rurami, kanałami.
CMCDragonkai
Czy użycie HDBC jest uważane za przestarzałe?
Janus Troelsen