생성자에 반대되는 함수에 대한 적절한 용어는 무엇입니까? 데이터 유형에서 값을 풀려면?


13

편집 : 나는 질문을 약간 표현하고 있습니다. 분명히 소멸 자라는 용어 가 OOP에서 매우 다른 무언가에 사용 된다는 것을 알지 못했기 때문에 혼란 이 생겼습니다. 개체가 파괴 될 때 호출되는 함수입니다. 함수형 프로그래밍에서 우리는 변경 가능한 상태를 피하려고 시도하므로 이에 상응하는 것은 없습니다. (질문에 적절한 태그를 추가했습니다.)

대신, (특히 같은 단일 값 데이터 유형에 대한 값을 풀기위한 레코드 필드 것을 본 적이 newtype들)이라고도한다 소멸자 혹은 deconstructor . 예를 들어 (하스켈로) :

newtype Wrap = Wrap { unwrap :: Int }

여기 Wrap생성자가 있고 unwrap무엇입니까?

질문은 :

  • unwrap함수형 프로그래밍에서 어떻게 호출 합니까? 해체 자? 파괴 장치? 아니면 다른 용어로?
  • 분명히 말하면, 이 / 다른 용어는 다른 기능 언어에 적용 가능 합니까, 아니면 Haskell에서만 사용됩니까?
  • 아마도, 비 기능적 언어로 된 일반적인 용어가 있습니까?

예를 들어 두 용어를 모두 보았습니다.

... 대부분은 스마트 생성자와 소멸자 를 제공하여 작업을 용이하게합니다. ...

에서 하스켈 위키 , 또는

... 여기서 일반적인 주제는 생성자- 해체 쌍 을 융합하는 것입니다 ...

하스켈은 wikibook (여기가 아마 좀 더 일반적인 의미에서 의미하는 것), 또는

newtype DList a = DL { unDL :: [a] -> [a] }

unDL 함수는 deconstructor로 DL 생성자를 제거합니다. ...

에서 실제 세계 하스켈 .


3
소멸자는 가장 널리 사용되는 용어 인 것 같습니다
Zavior

3
이것은 Haskell에 특화된 것 같습니다 (Haskell의 "소멸자"는 C ++에서와 같은 개념이 아닙니다. 이름의 유사성은 잘못된 것입니다). "값 풀기"라는 일반적인 개념을 원한다면 Haskell을 예로 사용해서는 안됩니다. C ++와 같은 언어에서 이러한 "언 래퍼"는 단순히 getter 일 수 있습니다!
Andres F.

1
질문에서 "소멸자"라는 단어를 제거하고 "unwrapper"를 대신 사용하여 언어간에이 패턴의 일반적인 이름이 있는지 묻습니다. :)
Andres F.

1
.unapply 또는 "extractor"는 스칼라에서 대략적인 유사체이지만, 대부분의 경우 단순히 패턴을 일치시키기 때문에 이름이 없을 수도 있습니다.
Gene T

답변:


5

이 개념에는 몇 가지 용어가 있습니다. 해체는 내가 하스켈 서클에서 일반적이라고 믿는 것입니다. 그것이 실제 세계 하스켈이 부르는 것입니다. 나는 Lisp 서클에서 destructuring (또는 destructuring bind)이라는 용어가 일반적이라고 생각합니다.


1
같은 일이 C #의 선택에지도의 회전처럼, 다음에 하나 개의 언어에서 다른 용어를 얻는 방법 재미있는, 하스켈은 줄이고 루비 분사를 가지고있다 배 혀짤배기 / 자바를 가지고, 하스켈은 바인드 스칼라 flatmap C 번호를 가지고 selectmany을 가지고있다
지미 호파

하스켈 서클에서는 실제로 해체라고합니다. 이상하게 들리면 Haskell에는 개체가 없으며 값만 있습니다. 따라서이 용어는 다른 의미를가집니다. 큰 부분은 '해체'가 정확히하는 것입니다. 그 메모에서 나는 개인적으로 객체 해체자가 객체 Disposers 라인을 따라 무언가라고 불러야한다고 생각합니다. 훨씬 더 정확합니다.
MasterMastic

8

Destructor는 C ++에서 사용되는 용어로, 내가 모르는 다른 언어 일 수 있습니다. 생성자에 의해 생성 된 리소스를 해제하는 데 사용되므로 정확히 반대의 작업을 수행합니다. 어쩌면이 개념이 문자 그대로 하스켈로 번역되지는 않지만이 용어는 어떤 곳에서 사용되는 것 같습니다.

편집 : 질문에 대한 편집 내용을 고려할 때 언 래퍼 (unwrapper)라고 부릅니다. 원래 질문에 대답 할 수 있었지만 이제는 내 지식에서 벗어 났으 므로이 편집을 너무 심각하게 받아들이지 마십시오.


1
C ++ / C # / Java의 "소멸자"라는 용어 사용은 Haskell의 용어와 일치하지 않습니다. 같은 단어, 다른 개념.
Andres F.

1
@AndresF. 그렇기 때문에 문장을 추가했습니다.Maybe in Haskell this does not translate really well but I don't know the language.
marco-fiset

1
공평하게, 나는 downvote를 제거했다. 잘못 인도 된 것은 실제 질문이며, 한 가지 질문을하는 것처럼 보이지만 실제로 다른 질문을합니다! :)
Andres F.

@AndresF. 그렇습니다. 문제는 오해의 소지가 있습니다. OP는 묻습니다 What's the proper term for a function inverse to a constructor?. 일부 Haskell 개념에보다 구체적으로 질문을 편집하지 않으면 대답을 그대로 둡니다.
marco-fiset

1
참고로 C #에는 종료자가 있지만 소멸자는 없지만 종료자는 비 결정적 실행으로 인해 다릅니다. 따라서 C #에서 소멸자의 오해가 확산되지 않도록 답변을 편집하십시오.
Jimmy Hoffa

6

OOP에서 생성자는 새로운 객체를 생성하고 초기화하는 함수 또는 언어 구조이며 (객체를 '구축합니다'), 소멸자는 객체를 정리하여 객체를 정리하는 이중, 함수 또는 언어 구조입니다. 보유) 삭제합니다.

그러나 Haskell (C ++과 달리)은 가비지 수집 기능을 가지고 있으며 가변 상태 또는 기타 부작용 (적어도 직접적이지 않음)을 지원하지 않기 때문에 OOP 의미에서 소멸자 개념에 대한 이유는 전혀 없습니다. 또한 Haskell 생성자는 OOP 생성자와 달리 개체 생성보다 더 많은 응용 프로그램을 가지고 있습니다. 또한 패턴 일치에 많이 사용됩니다 (아래 예 참조).

코드 예제에서 'unwrap'은 레코드 필드 이며 사용 방법에 따라 접근 자 또는 getter 라고도 할 수 있습니다 (후자는 렌즈 컨텍스트에서 사용 되기는하지만) 실제로 약간 혼란 스러울 수 있습니다).

나는 Haskell 컨텍스트에서 사용되는 '파괴자'(또는 '파괴자')라는 용어를 들어 본 적이 없습니다. 그러나 Andres F.가 지적했듯이 생성자에 의해 도입 된 줄 바꿈을 취소하는 함수를 나타내는 데 사용되기도합니다. 내 이해에 따르면 레코드 게터는 소멸자 역할을 할 수 있지만 더 복잡한 데이터 형식에서 가치를 얻는다면 정규 함수도 가능합니다. 예는 다음 maybeeither서곡에서.

그 주 unwrap, 당신의 예에서, 몇 가지 할 수 있습니다 :

  • 기능 (다른 것과 마찬가지로) : 예를 들어, map unwrap [ Wrap 23, Wrap 42 ]; 이 사용법은 OOP의 getter 메소드와 거의 같습니다.
  • 레코드 구성의 레코드 필드 지정자 let w = Wrap { unwrap = 23 }
  • 레코드 업데이트의 레코드 필드 지정자 : let w' = w { unwrap = 23 }; 이것은 OOP의 setter 메소드와 비슷합니다 (많이 짜 내면).
  • 패턴 일치의 레코드 필드 지정자 : f Wrap { unwrap = a } = a

하스켈 생성자를 OOP 생성자와 전혀 다른 것으로 생각하는 것이 가장 좋습니다. 더 나은 이해를 위해 Haskell 프로그래밍 언어에 대한 좋은 책을 다시 읽도록 제안합니다. "Real World Haskell" 은 정말 좋으며 "Learn You A Haskell"에 대한 좋은 소식을 들었습니다 . 둘 다 생성자 및 레코드 구문에 대한 좋은 설명이 있어야합니다.


2
Haskell 커뮤니티에서 "소멸자"라는 용어 사용에 대한 증거 : haskell.org/pipermail/beginners/2010-April/003946.htmlmail-archive.com/haskell-cafe@haskell.org/msg26463.html . Haskell lingo의 "소멸자"는 "언 래퍼 (unwrapper)"로, 메모리 관리 또는 객체 마무리와 전혀 관련이없는 개념입니다.
Andres F.

3
Haskell에서만 독점적으로 프로그램하는 저의 논문 감독은 또한 "파괴자 (destructor)"라는 용어를 래퍼 해제에 사용합니다.
Andres F.

글쎄, 나는이 용어를 한번도 접한 적이 없었다. OOP의 소멸자 개념과는 전혀 관련이 없다고 절대적으로 옳습니다.
tdammers

@AndresF .: 귀하의 의견을 존중하기 위해 편집되었습니다.
tdammers

@AndresF. 소멸자라고도 듣지 못했던이 점은 흥미롭지 만, 그 외에도 레코드 필드라고하는 것이 정확하지는 않을 것입니다. 그리고 필자가 "소멸자"라고 부르는 기술은 패턴 일치라고 생각합니다. ? 귀하의 경기가 목록을 철회 할 때 그것이 "파괴"라는 것을 이해합니다. 이것은 아마도 관련 용어이지만 ADT와 관련이 있습니까? 모든 목록을 destructuring 후 그냥 같은 ADT에 작용되는 것은 내가로부터 용어 destructuring 뭐가 목록입니다 ..입니다 stackoverflow.com/questions/11677806/...
지미 호파

2

나는 소멸자가 더 넓은 용어라고 생각합니다. Java 및 VB.NET과 같은 일부 언어에는 종료자가 있습니다. /programming/171952/is-there-a-destructor-for-java


C ++ 유사 언어의 소멸자는 할당 된 메모리를 해제하기 전에 정리 조치를 수행합니다. Haskell의 소멸자는 "외부 레이어"에서 값을 풉니 다 (아무것도 정리하는 데 사용하지 않음). 그들은 실제로 관련된 개념이 아닙니다.
Andres F.

2
나는 이것이 Haskel 질문이라는 것을 몰랐다.
JeffO

실제로 명확하지 않았습니다. 이 질문은 이제 다시 태깅되고 재구성되었습니다 :)
Andres F.

2

언어 간 규칙이없는 것처럼 보이기 때문에 스칼라가 일반적인 개념으로 사용하는 용어이기 때문에 기존의 사용법과 혼동되지 않기 때문에 일반적으로 추출기를 호출기로 부릅니다 .

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