Veri türünden bir değeri açmak için yapıcıya ters bir işlev için uygun terim nedir?


13

Düzenleme: Soruyu biraz yeniden ifade ediyorum. Görünüşe göre biraz karışıklığa neden oldum çünkü yıkıcı teriminin OOP'de oldukça farklı bir şey için kullanıldığını fark etmedim - bir nesne yok edildiğinde çağrılan bir işlev. Fonksiyonel programlamada değişebilir durumdan kaçınırız (böylece deneriz), böylece böyle bir eşdeğer yoktur. (Soruya uygun etiketi ekledim.)

Bunun yerine, bir değeri açmak için kayıt alanına (özellikle newtypes gibi tek değerli veri türleri için ) bazen yıkıcı veya belki de yapısökücü denildiğini gördüm . Örneğin, (Haskell'de):

newtype Wrap = Wrap { unwrap :: Int }

İşte Wrapyapıcı ve unwrapnedir?

Sorular:

  • unwrapFonksiyonel programlamada nasıl ararız ? Deconstructor? Yokedici? Yoksa başka bir terimle mi?
  • Ve açıklığa kavuşturmak gerekirse , bu / diğer terminoloji diğer işlevsel diller için de geçerli mi, yoksa sadece Haskell'de mi kullanılıyor?
  • Belki de, genel olarak, işlevsel olmayan dillerde bunun için bir terminoloji var mı?

Her iki terimi de gördüm, örneğin:

... Çoğu zaman, bunlarla çalışmayı kolaylaştırmak için akıllı yapıcılar ve yıkıcılar tedarik edilir. ...

En Haskell wiki veya

... Buradaki genel tema yapıcı- dekompresör çiftlerini kaynaştırmaktır ...

En Haskell kitabu (burada muhtemelen biraz daha genel anlamda içinde pinti) veya

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

UnDL işlevi, DL yapıcısını kaldıran yapısökümcümüzdür . ...

içinde Real World Haskell .


3
Yıkıcı en yaygın kullanılan terim gibi görünüyor
Zavior

3
Bu Haskell için uzmanlaşmıştır (Haskell'deki bir "yıkıcı" C ++ ile aynı kavram değildir. Adı benzerlik yanıltıcıdır). Genel olarak "bir değerin paketinin açılması" kavramını istiyorsanız, Haskell'i örnek olarak kullanmamalısınız. C ++ benzeri dillerde, böyle bir "sarıcı" sadece bir alıcı olabilir!
Andres F.12

1
Soruda "yıkıcı" kelimesini kaldırmanızı, bunun yerine "paket çıkarıcıyı" kullanmanızı ve diller arasında bu kalıp için genel bir ad olup olmadığını sormanızı öneririm :)
Andres F.

1
.unapply veya "extractor" scala'da kaba bir analogdur, ancak belki de bir isim yoktur çünkü çoğu durumda basitçe eşleşirsiniz
Gene T

Yanıtlar:


5

Konsept için birkaç terim vardır. Yeniden inşa etme, Haskell çevrelerinde yaygın olduğuna inandığım şey, Gerçek Dünya Haskell'in buna dediği şey. Yıkım (veya yıkım bağlama) teriminin Lisp çevrelerinde yaygın olduğuna inanıyorum.


1
Aynı şeyin bir dilden diğerine nasıl farklı bir terim aldığı ilginç, harita C #'da seçime dönüşüyor, haskell kat lisp / java azaldı ve yakut enjekte etti, haskell scala'yı bağladı C # selectmany var
Jimmy Hoffa

Buna Haskell çevrelerinde yapısöküm denir. Tuhaf geliyorsa, Haskell'in nesnesi olmadığını unutmayın - sadece değerler; Yani terimin farklı bir anlamı olduğunu söylemeye gerek yok. Büyük kısmı 'yapısöküm'ün tam olarak yaptığı şeydir. Bu notta kişisel olarak nesne yapısökücülerine nesne düzenleyicilerin çizgileri boyunca bir şey denmesi gerektiğini düşünüyorum. Çok, çok daha doğru.
MasterMastic

8

Yıkıcı C ++ ve belki de bilmediğim diğer diller tarafından kullanılan terimdir. Yapıcı tarafından oluşturulan kaynakların serbest bırakılmasında kullanılır, böylece tam tersini yaparlar. Belki de kavram kelimenin tam anlamıyla Haskell'e tercüme edilmiyor, ancak terim bazı yerlerde kullanılıyor gibi görünüyor.

DÜZENLEME: Soruya yaptığınız düzenlemeyi göz önünde bulundurursak, buna daha sonra bir sarıcı diyebilirim ... Orijinal soruya cevap verebildim ama şimdi bilgimden uzaklaştı, bu yüzden bu düzenlemeyi çok ciddiye almayın.


1
C ++ / C # / Java'nın "yıkıcı" terimini kullanmasının Haskell ile eşleşmediğini unutmayın. Aynı kelime, farklı kavramlar.
Andres F.12

1
@AndresF. Evet, bu yüzden cümleyi ekledim:Maybe in Haskell this does not translate really well but I don't know the language.
marco-fiset

1
Oldukça adil, aşağı oyumu kaldırdım. Sanırım yanlış yönlendirilmiş olan şey, bir şey soruyor gibi görünen, ama aslında başka bir şey soruyor! :)
Andres F.12

@AndresF. Evet soru yanıltıcı. OP sorar: What's the proper term for a function inverse to a constructor?. Soru bazı Haskell konseptine daha spesifik olacak şekilde düzenlenmedikçe, cevabımı olduğu gibi bırakacağım.
marco-fiset

1
Sadece bir not, C # 'ın finalizatörleri vardır, ancak yıkıcıları yoktur, çünkü finalizatörlerin deterministik olmayan yürütmesi vardır. Yani belki cevabınızı C # 'daki yıkıcıların yanlış adlarını yaymamak için düzenleyin.
Jimmy Hoffa

6

OOP'de yapıcı, yeni bir nesne oluşturan ve başlatan bir işlev veya dil yapısıdır (nesneyi 'oluşturur') ve bir yıkıcı, nesneden sonra temizleyen bir işlev veya dil yapısıdır (herhangi bir kaynağı serbest bırakarak) tutar) ve siler.

Bununla birlikte, Haskell (aksine, C ++ 'dan farklı olarak) çöp toplama özelliğine sahip olduğundan ve değişebilir durumu veya diğer yan etkileri (en azından doğrudan değil) desteklemediğinden, OOP anlamında yıkıcı bir kavram için kesinlikle hiçbir neden yoktur. Ayrıca, Haskell kurucuları, OOP kurucularının aksine, sadece nesne oluşturmadan daha fazla uygulamaya sahiptir; desen eşleşmesinde de yoğun olarak kullanılırlar (örnek için aşağıya bakın).

Kod örneğinizde, 'paketten çıkarma' bir kayıt alanıdır ve nasıl kullanıldığına bağlı olarak, onu bir erişimci olarak , hatta bir alıcı olarak da ifade edebilirim (her ne kadar ikincisi de bir lens bağlamında kullanılır, bu yüzden aslında biraz kafa karıştırıcı olabilir).

Haskell bağlamında kullanılan 'yıkıcı' (veya 'yapısökücü') terimini hiç duymadım; Andres F.'in belirttiği gibi, bazen bir kurucu tarafından sunulan sargıyı geri alan bir işleve atıfta bulunmak için kullanılır. Anladığım kadarıyla, bir kayıt alıcı bir yıkıcı olarak işlev görebilir, ancak daha karmaşık bir veri türünden bir değer elde etmeleri şartıyla düzenli işlevler de olabilir. Örnek olarak maybeve eitherPrelude den.

unwrapÖrneğin, birkaç şey olabileceğini unutmayın :

  • bir işlev (diğer tüm işlevler gibi): örneğin map unwrap [ Wrap 23, Wrap 42 ]; bu kullanım kabaca OOP'deki bir alıcı yöntemine eşdeğerdir.
  • bir kayıt yapısında bir kayıt alanı belirleyicisi: let w = Wrap { unwrap = 23 }
  • bir kayıt güncellemesinde bir kayıt alanı belirleyicisi let w' = w { unwrap = 23 }:; bu OOP'taki ayarlayıcı yöntemlere benzer (çok sıkarsanız).
  • kalıp eşleşmesinde bir kayıt alanı belirleyicisi: f Wrap { unwrap = a } = a

Haskell yapıcılarını OOP yapıcılarından tamamen farklı bir şey olarak düşünmek muhtemelen en iyisidir. Daha iyi bir anlayış için Haskell programlama dili hakkında iyi bir kitap okumanızı öneririm - "Gerçek Dünya Haskell" gerçekten çok iyi ve "Sizi Haskell Öğrenin" hakkında iyi şeyler duydum . Her ikisinin de yapıcılar ve özellikle kayıt sözdizimi hakkında iyi açıklamaları olmalıdır.


2
Haskell topluluklarında "yıkıcı" teriminin kullanıldığına dair kanıt: haskell.org/pipermail/beginners/2010-April/003946.html ve mail-archive.com/haskell-cafe@haskell.org/msg26463.html . Haskell lingo'daki bir "yıkıcı", bellek yönetimi veya nesne sonlandırma ile tamamen ilgisiz bir kavram olan bir "sarıcı" dır.
Andres F.12

3
Münhasıran Haskell'de program yapan tez direktörüm aynı zamanda bir ambalajcı için "yıkıcı" terimini kullanıyor.
Andres F.12

Bu terime hiç rastlamadım. Kesinlikle haklısınız, kullanıldığında, OOP'deki yıkıcı konseptiyle hiçbir ilgisi yoktur.
tdammers

@AndresF .: Yorumlarınızı onurlandırmak için düzenlendi.
tdammers

@AndresF. Bu, bir yıkıcı olarak adlandırıldığını hiç duymadığım için ilginçtir, ancak bir yana, sadece bir kayıt alanı olarak adlandırmak da doğru olmaz mı ve orada "yıkıcı" olarak adlandırdığım teknik sadece bir desen eşleşmesi olarak ? Maçınız bir listeyi birbirinden ayırdığında buna "yıkım" denildiğini anlıyorum. Tüm yıkımdan sonra bir liste sadece bir liste gibi bir ADT üzerinde hareket ediyor .. yıkım terimi stackoverflow.com/questions/11677806/…
Jimmy Hoffa

2

Yıkıcı daha geniş bir terimdir. Java ve VB.NET gibi bazı dillerde bir sonlandırıcı bulunur. /programming/171952/is-there-a-destructor-for-java


C ++ benzeri dillerdeki bir yıkıcı, ayrılmış belleği serbest bırakmadan önce temizleme eylemleri gerçekleştirir. Haskell'deki bir yıkıcı, "dış katmanından" bir değeri açar (hiçbir şeyi temizlemek için kullanmazsınız). Gerçekten birbiriyle ilişkili kavramlar değiller.
Andres F.

2
Sanırım bunun bir Haskel sorusu olduğunu anlamadım.
JeffO

Gerçekten belli değildi. Soru şimdi yeniden etiketlendi ve yeniden düzenlendi :)
Andres F.

2

Herhangi bir çapraz dil kuralı olmadığı için, genellikle onlara çıkarıcı diyorum, çünkü bu Scala'nın genel kavram için kullandığı bir terimdir ve mevcut herhangi bir kullanımla karıştırılması muhtemel değildir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.