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
엄밀
생성자 사이의 엄격에 아주 미묘한 차이로 리드를 삭제된다는 사실 data
과 newtype
. 특히, data
"리프팅 된"유형을 소개합니다. 이는 본질적으로 최저값으로 평가하는 추가 방법이 있다는 의미입니다. 로 런타임에 추가 생성자가 없으므로이 newtype
속성은 유지되지 않습니다.
Book
to (,)
생성자의 추가 포인터를 사용하면 최저 값을 넣을 수 있습니다.
그 결과, newtype
와 data
같이 약간 다른 엄격 속성이 하스켈 위키 문서에 설명되어 있습니다 .
언 박싱
생성자가 없기 때문에의 구성 요소를 개봉하는 것은 이치에 맞지 않습니다 newtype
. 작성하는 것이 합리적이지만 :
data T = T {-# UNPACK #-}!Int
T
생성자와 Int#
구성 요소 가 포함 된 런타임 객체를 생성합니다 . 당신은 베어 얻을 Int
로를 newtype
.
참고 문헌 :
- 하스켈 위키의 "Newtype"
- 엄격성에 대한 Norman Ramsey의 답변
참고 URL : https://stackoverflow.com/questions/5889696/difference-between-data-and-newtype-in-haskell
'Programing' 카테고리의 다른 글
이벤트 처리기가 가비지 수집을 중지합니까? (0) | 2020.05.21 |
---|---|
“객체 참조가 객체의 인스턴스로 설정되지 않았다”는 것은 무엇을 의미합니까? (0) | 2020.05.21 |
MySQL에 삽입 할 때 PHP에서 작은 따옴표를 이스케이프 처리 (0) | 2020.05.21 |
텍스트 뷰에 맞게 텍스트 글꼴 크기를 조정하는 방법 (0) | 2020.05.21 |
자바 생성자 상속 (0) | 2020.05.21 |