이 글을 쓸 때의 차이점은 무엇입니까?
data Book = Book Int Int
대
newtype Book = Book (Int, Int) -- "Book Int Int" is syntactically invalid
newtype Book = Book Int Int
유효하지 않습니다. 그러나 newtype Book = Book (Int, Int)
아래 dons가 언급 한대로 가질 수 있습니다 .
이 글을 쓸 때의 차이점은 무엇입니까?
data Book = Book Int Int
대
newtype Book = Book (Int, Int) -- "Book Int Int" is syntactically invalid
newtype Book = Book Int Int
유효하지 않습니다. 그러나 newtype Book = Book (Int, Int)
아래 dons가 언급 한대로 가질 수 있습니다 .
답변:
좋은 질문입니다!
몇 가지 주요 차이점이 있습니다.
대표
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
엄밀
생성자 사이의 엄격에 아주 미묘한 차이로 리드를 삭제된다는 사실 data
과 newtype
. 특히, data
"리프팅 된"유형을 소개합니다. 이는 본질적으로 최저값으로 평가할 수있는 추가 방법이 있다는 의미입니다. 에는 런타임에 추가 생성자가 없으므로이 newtype
속성은 유지되지 않습니다.
Book
to (,)
생성자 에 추가 포인터를 사용하면 최저 값을 넣을 수 있습니다.
그 결과, newtype
와 data
같이 약간 다른 엄격 속성이 하스켈 위키 문서에 설명되어 있습니다 .
언 박싱
생성자가 없으므로의 구성 요소를 개봉하는 것은 이치에 맞지 않습니다 newtype
. 작성하는 것이 합리적이지만 :
data T = T {-# UNPACK #-}!Int
T
생성자와 Int#
구성 요소 가 포함 된 런타임 객체를 생성합니다 . 당신은 베어 얻을 Int
로를 newtype
.
참고 문헌 :
newtype
컴파일 및 런타임에서 이전 및 새 유형에 대해 동일한 표현을 사용하는 경우 지워지면 어떻게 이전 및 새 유형의 인스턴스를 정의 할 수 있습니까? 런타임에서 사용할 인스턴스를 어떻게 이해할 수 있습니까?
newtype
지워지지 않습니다.