Real World Haskell의 어떤 부분이 이제 쓸모 없거나 나쁜 습관으로 간주됩니까?


107

Real World Haskell 의 19 장 에서 많은 예제가 이제 Control.Exception.

그래서이 책의 ​​내용 중 일부는 실제로 쓸모없고 더 이상 공부할 가치가 없다고 생각합니다. 결국 6 년이 지났습니다. 저의 유일한 다른 참고 자료는 Learn You a Haskell For Great Good 이지만 훌륭한 책이지만 RWH에 비해 훨씬 더 기본적입니다.

이전에 책을 읽은 사람이 책의 어느 부분이 더 이상 관련이 없는지에 대해 조언 해 주시겠습니까? 특히 책의 후반부에있는 장에서는 소프트웨어 트랜잭션 메모리, 동시 프로그래밍, 소켓 프로그래밍 등이 있습니다.

편집 : 이것은 2008 년 12 월에 출판 된 책의 판에 관한 것으로, 오늘 (2017 년 11 월) 현재 유일하게 알려진 판입니다.


2
Real World Haskell 의 온라인 버전 AFAIK는 수시로 업데이트됩니다. Haskell Wikibook 에서 더 유용한 정보를 찾을 수 있습니다 .
Vektorweg

@Vektorweg 지금까지 Wikibook에 대한 대부분의 작업은 소개 장 (약은 LYAH 수준과 동일한 영역을 다룹니다)과 더 발전된 이론 및 유형 시스템 주제를 다루었습니다. RWH swang의 후반부에서 언급 한 것처럼 적용된 문제의 경우 현재로서는 RWH가 더 나은 선택입니다. 비록 위키

1
@Vektorweg : 인쇄물과 온라인 버전 사이에 큰 차이를 느끼지 못했습니다. 또한 온라인 버전이 전혀 업데이트되지 않는 것 같고, 블룸 필터 챕터는 오랫동안 (최소 2009 년) 깨졌습니다. 즉, Wikibooks, yay :).
Zeta

1
심지어 @Swang 주 하스켈 당신을 알아 이제, 오래된 물건을 포함 Monad의 서브 클래스입니다 Applicative.
jub0bs

1
책 의 을 언급하십시오 . 일반적으로 제품에 대해 이야기 할 때 항상 version , platform , OS , edition 등을 언급하십시오 !
Nawaz

답변:


137

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변경 되었습니다 . 같은 많은 다른 기능은 , 이전에만 정의 된 그 많은 다른 으로는 더 일반적인로 대체되었습니다foldrfoldl[a]PreludeFoldable t => t a 변종.

11 장. 테스트 및 품질 보증

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부터는 Monad2007 년에 계획되지 않았던 의 수퍼 클래스입니다 .

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

그래서 그들은 모나드 변환기에 의해 정의됩니다.

17 장. C와의 인터페이스 : FFI

전체 장은 괜찮지 만 댓글이나 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(), newdelete, allocatedeallocate, 하나는 항상 올바른 기능을 사용해야합니다.

TL; DR 항상 메모리를 할당 한 동일한 할당 자로 메모리를 해제해야합니다.

외부 함수가 메모리를 할당하면 함께 제공되는 할당 해제 함수도 사용해야합니다.

19 장. 오류 처리

오류 처리가 6.8에서 6.10으로 완전히 변경되었지만 이미 확인했습니다. 문서를 더 잘 읽으십시오 .

22 장. 확장 예제 : 웹 클라이언트 프로그래밍

일부 예가 깨진 것 같습니다. 또한 다른 HTTP 라이브러리를 사용할 수 있습니다.

25 장. 프로파일 링과 최적화

일반적인 프로파일 링 기술은 여전히 ​​동일하며 예제 (아래 참조)는 프로그램에서 발생할 수있는 문제에 대한 훌륭한 사례 연구입니다. 그러나 RWH에는 예를 들어 ThreadScope를 통한 다중 스레드 프로파일 링이 없습니다. 또한 lazy IO는 내가 아는 한 전체 책에서 걱정하지 않습니다.

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

24 장 및 28 장 (동시 및 병렬 프로그래밍 및 STM)

하지만 제 24 장 동시 멀티 코어 프로그래밍28 장 소프트웨어 트랜잭션 메모리는 여전히 사이먼 말로우의 책, 관련된 하스켈에서 병렬 및 동시 프로그래밍 (2013) 동시 병렬 프로그래밍에만 초점을 맞추고 아주 최근이다. GPU 프로그래밍 및 repa는 RWH에서 완전히 누락되었습니다.

26 장. 고급 라이브러리 디자인 : Bloom 필터 구축

다른 장과 마찬가지로 디자인 라이브러리의 일반 지침은 여전히 ​​잘 작성되고 관련성이 있습니다. 그러나에 관한 일부 변경 (?)으로 인해 ST결과를 더 이상 컴파일 할 수 없습니다.

27 장. 네트워크 프로그래밍

여전히 대부분 최신 상태입니다. 결국 네트워크 프로그래밍은 그렇게 쉽게 변하지 않습니다. 그러나, 코드는 사용되지 않는 기능을 사용 bindSocket하고 sClose교체해야 bind하고 close(바람직하게는 정규화 된 수입을 통해). 매우 낮은 수준이므로 더 전문화 된 높은 수준의 라이브러리를 사용하는 것이 좋습니다.

부록 A. GHC 및 Haskell 라이브러리 설치

GHC 6.8은 Haskell 플랫폼이 도입되기 전의 마지막 버전입니다. 따라서 부록은 GHC와 Cabal을 손으로 받으라고 알려줍니다. 하지마. 대신 haskell.org 다운로드 페이지 의 지침을 따르십시오 .

또한 부록에서는 Cabal 1.18에 도입 된 Cabal 샌드 박스에 대해 설명하지 않으며 종속성 지옥 에서 벗어날 수 있습니다 . 그리고 물론 stack완전히 누락되었습니다.

누락 된 콘텐츠

일부 주제는 RWH에서 전혀 논의되지 않습니다. 이 같은 라이브러리 스트리밍 포함 파이프도관 , 또한 렌즈를 .

이러한 주제에 대한 몇 가지 리소스가 있지만 여기에 소개에 대한 링크가 있습니다. 또한 벡터를 사용하려면 vectors패키지를 사용하십시오 .

Control.Applicative

RWH는 여러 지점에서 Control.Applicative's (<$>)를 사용 하지만 전혀 설명하지 않습니다 Control.Applicative. LYAHTypeclassopedia 에는 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 이후에 발생한 기타 확장

고마워요, 이것이 정확히 제가 추구했던 것입니다. :), 당신은 나에게 상태 모나드 문제를 상기시키고, 더 이상 State 값 생성자를 가지고 있지 않으며, 내가 그것을 읽을 때 알아 내기 위해 머리를 긁적 거리게했습니다.
swang

@swang : 아직 완료되지 않았습니다. 아마도 Bryan 또는 Don은 변경된 기능에 대해 더 많이 알고있을 것입니다. 어느 쪽이든 일반 지침은 여전히 ​​유효합니다.
Zeta

1
높은 수준의 네트워킹의 경우 network-simple을 선호 합니다 .
Lambda Fairy

"변환기", 코 루틴 및 스트리밍 라이브러리 파이프, 도관 사이에는 관계가 있습니다.
CMCDragonkai 2015 년

HDBC 사용이 오래된 것으로 간주됩니까?
Janus Troelsen
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.