Edit: Estou reformulando a pergunta um pouco. Aparentemente, causei alguma confusão porque não percebi que o termo destruidor é usado no OOP para algo bem diferente - é uma função invocada quando um objeto está sendo destruído. Na programação funcional, (tentamos) evitar o estado mutável, para que não exista esse equivalente. (Adicionei a tag apropriada à pergunta.)
Em vez disso, vi que o campo de registro para desembrulhar um valor (especialmente para tipos de dados de valor único, como newtype
s) às vezes é chamado de destruidor ou talvez desconstrutor . Por exemplo, vamos ter (em Haskell):
newtype Wrap = Wrap { unwrap :: Int }
Aqui Wrap
está o construtor e unwrap
é o que?
As perguntas são:
- Como chamamos
unwrap
em programação funcional? Desconstrutor? Destruidor? Ou por algum outro termo? - E para esclarecer, essa / outra terminologia é aplicável a outras linguagens funcionais ou é usada apenas no Haskell?
- Talvez também exista alguma terminologia para isso em geral, em linguagens não funcionais ?
Eu vi os dois termos, por exemplo:
... Na maioria das vezes, fornece-se construtores e destruidores inteligentes para facilitar o trabalho com eles. ...
no wiki Haskell , ou
... O tema geral aqui é fundir pares construtor - desconstrutor como ...
no Haskell wikibook (aqui provavelmente significa um sentido um pouco mais geral), ou
newtype DList a = DL { unDL :: [a] -> [a] }
A função unDL é o nosso desconstrutor , que remove o construtor DL. ...
no mundo real Haskell .
fonte
Respostas:
Existem vários termos para o conceito. Desconstruir é o que eu acredito ser comum nos círculos Haskell, é o que o Mundo Real Haskell chama. Eu acredito que o termo desestruturação (ou ligação desestruturante) é comum nos círculos Lisp.
fonte
Destruidor é o termo usado por C ++ e talvez outras linguagens que eu não conheço. Eles são usados para liberar recursos criados pelo construtor para fazer exatamente o oposto dele. Talvez o conceito não se traduza literalmente em Haskell, mas o termo parece ser usado em alguns lugares.
EDIT: Considerando a sua edição da pergunta, eu chamaria de desempacotador ... Consegui responder à pergunta original, mas agora ela se afastou do meu conhecimento, por isso não leve essa edição muito a sério.
fonte
Maybe in Haskell this does not translate really well but I don't know the language.
What's the proper term for a function inverse to a constructor?
. A menos que a pergunta seja editada para ser mais específica a algum conceito de Haskell, deixarei minha resposta como está.No OOP, um construtor é uma função ou linguagem que cria e inicializa um novo objeto ('constrói' o objeto), e um destruidor é seu dual, uma função ou linguagem que limpa após o objeto (liberando quaisquer recursos que ele retém) e o exclui.
No entanto, como Haskell (ao contrário, digamos, C ++) tem coleta de lixo e não suporta estado mutável ou outros efeitos colaterais (pelo menos não diretamente), não há absolutamente nenhuma razão para uma noção de destruidor no sentido de POO. Além disso, os construtores Haskell, diferentemente dos construtores OOP, têm mais aplicativos do que apenas criação de objetos; eles também são muito usados na correspondência de padrões (veja um exemplo abaixo).
No seu exemplo de código, 'desembrulhar' é um campo de registro e, dependendo de como é usado, eu posso me referir a ele como um acessador ou talvez até um getter (embora o último também seja usado em um contexto de lente, ele pode ser um pouco confuso).
Eu nunca ouvi o termo "destruidor" (ou "desconstrutor") usado no contexto de Haskell; como observa Andres F., no entanto, às vezes é usado para se referir a uma função que desfaz o empacotamento introduzido por um construtor. No meu entender, um gravador de registros pode servir como destruidor, mas também funções regulares, desde que eles recuperem um valor de um tipo de dados mais complexo. Exemplos incluem
maybe
eeither
do Prelude.Observe que
unwrap
, no seu exemplo, pode haver várias coisas:map unwrap [ Wrap 23, Wrap 42 ]
; esse uso é aproximadamente equivalente a um método getter no OOP.let w = Wrap { unwrap = 23 }
let w' = w { unwrap = 23 }
; isso é semelhante aos métodos setter no OOP (se você apertar muito).f Wrap { unwrap = a } = a
Provavelmente é melhor pensar nos construtores Haskell como algo completamente diferente dos construtores OOP. Eu sugiro que você (re) leia um bom livro sobre a linguagem de programação Haskell para uma melhor compreensão - "Mundo Real Haskell" é realmente bom, e eu ouvi coisas boas sobre "Aprenda Você A Haskell" . Ambos devem ter boas explicações sobre construtores e gravar sintaxe em particular.
fonte
Eu acho que destruidor é o termo mais amplo. Algumas linguagens como Java e VB.NET têm um finalizador. /programming/171952/is-there-a-destructor-for-java
fonte
Como não parece haver nenhuma convenção entre idiomas, costumo chamá-los de extratores , porque esse é o termo que o Scala usa para essa noção geral e porque não é provável que seja confundido com qualquer uso existente.
fonte