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(), new와 delete, allocate와 deallocate, 하나는 항상 올바른 기능을 사용해야합니다.

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. 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 이후에 발생한 기타 확장

고마워요, 이것이 정확히 제가 추구했던 것입니다. :), 당신은 나에게 상태 모나드 문제를 상기시키고, 더 이상 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.