Programing

Haskell에서`data`와`newtype`의 차이점

lottogame 2020. 5. 21. 08:01
반응형

Haskell에서`data`와`newtype`의 차이점


이 글을 쓸 때의 차이점은 무엇입니까?

data Book = Book Int Int

newtype Book = Book (Int, Int) -- "Book Int Int" is syntactically invalid

좋은 질문입니다!

몇 가지 주요 차이점이 있습니다.

대표

  • A newtype는 데이터가 랩핑하는 유형과 런타임시 정확히 동일한 표현을 갖도록 보장합니다.
  • 동안은 data런타임에 새로운 데이터 구조를 선언합니다.

여기서 핵심 newtype은 컴파일 타임에에 대한 구문 이 지워진다는 것입니다.

예 :

  • data Book = Book Int Int

데이터

  • newtype Book = Book (Int, Int)

신형

생성자가 지워 (Int,Int)지므로, 와 정확히 동일한 표현을 갖는 방법에 유의하십시오 Book.

  • data Book = Book (Int, Int)

데이터 튜플

에 추가 Book생성자가 없습니다 newtype.

  • data Book = Book {-# UNPACK #-}!Int {-# UNPACK #-}!Int

여기에 이미지 설명을 입력하십시오

포인터가 없습니다! Int필드는 Book생성자의 상자 에없는 단어 크기의 필드입니다 .

대수 데이터 타입

이 때문에 생성자를 지울 필요가 있기 때문에 단일 생성자로newtype 데이터 유형을 래핑 할 때만 작동합니다 . "대수"신형에 대한 개념은 없습니다. 즉, 다음과 같은 새로운 유형을 작성할 수 없습니다.

data Maybe a = Nothing
             | Just a

생성자가 둘 이상이므로 쓸 수 없어

newtype Book = Book Int Int

엄밀

생성자 사이의 엄격에 아주 미묘한 차이로 리드를 삭제된다는 사실 datanewtype. 특히, data"리프팅 된"유형을 소개합니다. 이는 본질적으로 최저값으로 평가하는 추가 방법이 있다는 의미입니다. 로 런타임에 추가 생성자가 없으므로이 newtype속성은 유지되지 않습니다.

Bookto (,)생성자의 추가 포인터를 사용하면 최저 값을 넣을 수 있습니다.

그 결과, newtypedata같이 약간 다른 엄격 속성이 하스켈 위키 문서에 설명되어 있습니다 .

언 박싱

생성자가 없기 때문에의 구성 요소를 개봉하는 것은 이치에 맞지 않습니다 newtype. 작성하는 것이 합리적이지만 :

data T = T {-# UNPACK #-}!Int

T생성자와 Int#구성 요소 가 포함 된 런타임 객체를 생성합니다 . 당신은 베어 얻을 Int로를 newtype.


참고 문헌 :

참고 URL : https://stackoverflow.com/questions/5889696/difference-between-data-and-newtype-in-haskell

반응형