RWH의 주요 이슈
그것은 낡았다. RWH는 GHC 버전 6.8이 사용되었을 때 작성되었습니다. 6.8 은 기본 버전 3.0.xx를 사용했습니다. 6.10.1은 이미 4.0.0.0을 사용하여 많은 변경 사항 을 도입 했습니다 . 그리고 그것은 6.8에서 6.10으로 점프 한 것입니다. GHC의 현재 버전은 7.10입니다. 모나드가 변경되었습니다. 토론 현재 있습니다 제거 return
로부터는Monad
소위,Monad
실제 세계 하스켈의 인스턴스가 정말 현실 세계와 동기화 될 것이다.
즉, 일반 지침에 여전히 유용한 리소스입니다. 그러나 출시 이후 많은 라이브러리가 변경되었습니다.
RWH를 읽으면서 읽을 수있는 것은 Stephen Diehl의 "What I Wish I Knew When Learning Haskell" 입니다. 추가 통찰력을 제공하지만 일부 섹션은 실제로 초보자에게 친숙하지 않습니다.
총론
- 의견을 읽으십시오. 일반적으로 주어진 단락 / 섹션이 여전히 관련성이 있는지 및 / 또는 작동하는지에 대한 정보를 포함합니다.
- 사용하려는 라이브러리 / 함수에 대한 문서를 읽으십시오. 당신이 게 으르더라도 적어도 유형을 알고 있습니다.
장에 대한 설명
이것은 RWH를 읽는 동안 내가 알아 차린 몇 가지 사항에 대한 간략한 개요입니다. 아마도 불완전 할 것입니다.
2 장. 유형과 기능 vs FTP
GHC 7.10 이후 .
Foldable-Traversable-Proposal 로 인해 유형 null
이 변경 되었습니다 . 같은 많은 다른 기능은 , 이전에만 정의 된 그 많은 다른 으로는 더 일반적인로 대체되었습니다foldr
foldl
[a]
Prelude
Foldable t => t a
변종.
Haskell-platform 2010 또는 후반 2008 이후.
이은에 언급되어 있지만 각주 의 QuickCheck 라이브러리 예를 들어 버전 2로 버전 1에서 여러 가지 방법으로 변경, 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 Proposal ( 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
그래서 그들은 모나드 변환기에 의해 정의됩니다.
전체 장은 괜찮지 만 댓글이나 Yuras Shumovich의 블로그 에서 읽을 수 있듯이 다음 코드의 종료 자 부분은 잘못된 관행입니다.
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를 통한 다중 스레드 프로파일 링이 없습니다. 또한 lazy IO는 내가 아는 한 전체 책에서 걱정하지 않습니다.
mean :: [Double] -> Double
mean xs = sum xs / fromIntegral (length xs)
24 장 및 28 장 (동시 및 병렬 프로그래밍 및 STM)
하지만 제 24 장 동시 멀티 코어 프로그래밍 및 28 장 소프트웨어 트랜잭션 메모리는 여전히 사이먼 말로우의 책, 관련된 하스켈에서 병렬 및 동시 프로그래밍 (2013) 동시 병렬 프로그래밍에만 초점을 맞추고 아주 최근이다. GPU 프로그래밍 및 repa는 RWH에서 완전히 누락되었습니다.
다른 장과 마찬가지로 디자인 라이브러리의 일반 지침은 여전히 잘 작성되고 관련성이 있습니다. 그러나에 관한 일부 변경 (?)으로 인해 ST
결과를 더 이상 컴파일 할 수 없습니다.
27 장. 네트워크 프로그래밍
여전히 대부분 최신 상태입니다. 결국 네트워크 프로그래밍은 그렇게 쉽게 변하지 않습니다. 그러나, 코드는 사용되지 않는 기능을 사용 bindSocket
하고 sClose
교체해야 bind
하고 close
(바람직하게는 정규화 된 수입을 통해). 매우 낮은 수준이므로 더 전문화 된 높은 수준의 라이브러리를 사용하는 것이 좋습니다.
GHC 6.8은 Haskell 플랫폼이 도입되기 전의 마지막 버전입니다. 따라서 부록은 GHC와 Cabal을 손으로 받으라고 알려줍니다. 하지마. 대신 haskell.org 다운로드 페이지 의 지침을 따르십시오 .
또한 부록에서는 Cabal 1.18에 도입 된 Cabal 샌드 박스에 대해 설명하지 않으며 종속성 지옥 에서 벗어날 수 있습니다 . 그리고 물론 stack
완전히 누락되었습니다.
누락 된 콘텐츠
일부 주제는 RWH에서 전혀 논의되지 않습니다. 이 같은 라이브러리 스트리밍 포함 파이프 및 도관 , 또한 렌즈를 .
이러한 주제에 대한 몇 가지 리소스가 있지만 여기에 소개에 대한 링크가 있습니다. 또한 벡터를 사용하려면 vectors
패키지를 사용하십시오 .
Control.Applicative
RWH는 여러 지점에서 Control.Applicative
's (<$>)
를 사용 하지만 전혀 설명하지 않습니다 Control.Applicative
. LYAH 및 Typeclassopedia 에는 Applicative
. 그것이 Applicative
슈퍼 클래스 라는 것을 감안할 때Monad
그것이 (위 참조) 클래스를 마음으로 배우는 것이 좋습니다.
또한 여러 연산자 Control.Applicative
(및 유형 클래스 자체)가 이제의 일부 Prelude
이므로 연산자가 <$>
, <*>
및 다른 연산자와 충돌하지 않도록하십시오 .
렌즈
스트리밍 라이브러리
압형
- 샌드 박스 를 도입 한 Cabal 버전 1.18
stack
, Haskell 프로젝트 개발을위한 크로스 플랫폼 프로그램
ghc-mod
, vim, emacs, Sublime Text 및 기타 편집 기용 백엔드
새로운 / 누락 된 언어 확장 및 GHC 변경
- 런타임 유형 다형성 (
:i ($)
엄청나게 변경됨)
-XTypeInType
-XDataKinds
-XGADT
-XRankNTypes
-XGenericNewtypeDeriving
-XDeriveFunctor
- 6.6 이후에 발생한 기타 확장