Qual é o termo adequado para uma função inversa a um construtor - para desembrulhar um valor de um tipo de dados?

13

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 newtypes) às vezes é chamado de destruidor ou talvez desconstrutor . Por exemplo, vamos ter (em Haskell):

newtype Wrap = Wrap { unwrap :: Int }

Aqui Wrapestá o construtor e unwrapé o que?

As perguntas são:

  • Como chamamos unwrapem 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 .

Petr Pudlák
fonte
3
Destructor parece ser o termo mais utilizado
Zavior
3
Isso parece especializado em Haskell (um "destruidor" em Haskell não é o mesmo conceito que em C ++. A similaridade do nome é enganosa). Se você deseja o conceito geral de "desembrulhar um valor", provavelmente não deve usar o Haskell como exemplo. Em linguagens do tipo C ++, esse "desempacotador" pode ser simplesmente um getter!
Andres F.12 /
1
Eu sugiro que você remover a palavra "destruidor" da questão, use "unwrapper" em vez, e perguntar se existe um nome genérico para esse padrão através das línguas :)
Andres F.
1
.unapply, ou "extractor" é um análogo áspera em scala, mas talvez não há nenhum nome porque na maioria dos casos, você simplesmente correspondência de padrões
Gene T

Respostas:

5

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.

pedregoso
fonte
1
Interessante como a mesma coisa obtém um termo diferente de um idioma para o outro, como o mapa se transforma em select em C #, haskell dobrou lisp / java reduziu e ruby ​​injetou, haskell vinculou scala tem flatmap C # tem selectmany
Jimmy Hoffa
É de fato chamado desconstrução nos círculos de Haskell. Se isso soa estranho, lembre-se de que Haskell não tem objetos - apenas valores; Portanto, escusado será dizer que o termo tem um significado diferente. A grande parte é que 'desconstrução' é exatamente o que faz. Nessa nota, eu pessoalmente acho que desconstrutores de objetos devem ser chamados de algo como as de descartadores de objetos. É muito, muito mais preciso.
MasterMastic 24/10
8

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.

marco-fiset
fonte
1
Observe que o uso do termo "destruidor" em C ++ / C # / Java não corresponde ao de Haskell. Mesma palavra, conceitos diferentes.
Andres F.12 /
1
@AndresF. Sim, foi por isso que adicionei a frase:Maybe in Haskell this does not translate really well but I don't know the language.
marco-fiset
1
Justo, tirei meu voto negativo. Eu acho que o que está errado é a pergunta real, que parece estar perguntando uma coisa, mas está realmente perguntando outra! :)
Andres F.
@AndresF. Sim, a pergunta é enganosa. O OP pergunta: 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á.
marco-Fiset
1
Apenas uma observação, o C # possui finalizadores, mas não destruidores, que são diferentes porque os finalizadores têm execução não determinística. Então, talvez edite sua resposta para não espalhar o nome impróprio de destruidores em C #.
Jimmy Hoffa 12/10
6

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 maybee eitherdo Prelude.

Observe que unwrap, no seu exemplo, pode haver várias coisas:

  • uma função (como qualquer outra): você pode, por exemplo, fazer map unwrap [ Wrap 23, Wrap 42 ]; esse uso é aproximadamente equivalente a um método getter no OOP.
  • um especificador de campo de registro em uma construção de registro: let w = Wrap { unwrap = 23 }
  • um especificador de campo de registro em uma atualização de registro: let w' = w { unwrap = 23 } ; isso é semelhante aos métodos setter no OOP (se você apertar muito).
  • um especificador de campo de registro na correspondência de padrões: 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.

tdammers
fonte
2
Evidência de uso do termo "destruidor" em comunidades Haskell: haskell.org/pipermail/beginners/2010-April/003946.html e mail-archive.com/[email protected]/msg26463.html . Um "destruidor" no jargão de Haskell é um "desempacotador", um conceito totalmente não relacionado ao gerenciamento de memória ou à finalização de objetos.
Andres F.12 /
3
Meu diretor de tese, que programa exclusivamente em Haskell, também usa o termo "destruidor" para desembrulhar.
Andres F.
Bem, eu nunca me deparei com o termo. Você está absolutamente certo de que, quando usado, não tem absolutamente nada a ver com o conceito de destruidor no OOP.
Tdammers #
@AndresF .: Editado para honrar seus comentários.
Tdammers #
@AndresF. Isso é interessante, porque eu também nunca ouvi falar dele como destruidor, embora, além disso, não seria preciso apenas se referir a ele como um campo de registro, e a técnica que eu vejo chamada "destruidor" lá como apenas uma correspondência de padrões ? Entendo que é chamado de "desestruturação" quando sua correspondência está separando uma lista. Esse talvez seja um termo relacionado, mas em referência a um ADT? Afinal desestruturação uma lista é apenas atuando em um ADT como é o que uma lista é .. Eu tenho a desestruturação prazo de stackoverflow.com/questions/11677806/...
Jimmy Hoffa
2

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

JeffO
fonte
Um destruidor em linguagens do tipo C ++ executa ações de limpeza antes de liberar a memória alocada. Um destruidor em Haskell desembrulha um valor de sua "camada externa" (você não o usa para limpar nada). Eles não são conceitos verdadeiramente relacionados.
Andres F.12 /
2
Acho que não percebi que essa é uma pergunta de Haskel.
10138 JeffO
Não estava claro de fato. A questão já foi retagged e reformulado :)
Andres F.
2

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.

Chama de Ptharien
fonte