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 return
zMonad
, więc Monad
instancja 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 null
został zmieniony z powodu propozycji Foldable-Traversable-Propozycja . Wiele innych funkcji, takich jak foldr
, foldl
i wiele innych, które zostały wcześniej zdefiniowane tylko dla [a]
w Prelude
zostały zastąpione bardziej ogólnegoFoldable t => t a
wariantów.
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 generate
teraz używa Gen a
zamiast StdGen
, a funkcjonalność starej generate
jest 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 Applicative
jest teraz nadklasą Monad
czegoś, co nie było planowane w 2007 roku.
W GHC 7.10 Applicative
stanie 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
/ Reader
monady
W Czy monada z prawdziwego stanu może wstać? - twierdzą autorzy
Aby zdefiniować Monad
instancję, 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ż State
i 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.
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()
, new
with delete
, allocate
with 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.
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ę .
Niektóre przykłady wydają się być zepsute. Dostępne są również inne biblioteki HTTP.
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.
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 ST
wynikó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 bindSocket
i sClose
, które powinny zostać zastąpione przez bind
i 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.
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 stack
cał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 vectors
pakietu.
Control.Applicative
RWH zastosowania Control.Applicative
„s (<$>)
na kilka punktów, ale nie wyjaśnia Control.Applicative
wcale. LYAH i Typeklasopedia zawierają sekcje dotyczące Applicative
. Biorąc pod uwagę, że Applicative
jest 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