SORU
8 ŞUBAT 2012, ÇARŞAMBA


Cebirsel veri türleri Cebir taciz - neden bu işe yarıyor mu?

'Cebirsel' cebirsel veri türleri için ifade matematikte. bir geçmişi olan biri için gerçekten iyi görünüyor Bana ne demek istediğimi açıklayayım.

Tanımlanmış olması temel türleri

  • Ürün
  • Birliği 1**
  • Singleton X
  • Ünitesi 1

ve vesaire X•X X X 2X kısaltma kullanarak, örneğin bağlı listeler için cebirsel ifadeleri tanımlayabiliriz

data List a = Nil | Cons a (List a)L = 1 X • L

ve ağaçlar ikili:

data Tree a = Nil | Branch a (Tree a) (Tree a)T = 1 X • T²

Şimdi, bir matematikçi olarak ilk düşüncem bu ifadeler ile fındık gitmek ve L T çözmeye çalışın. Tekrarlanan ikame yoluyla bunu yapabilirim, ama çok daha kolay gösterimde cesedi istismar ve onu tekrar düzenleyebilirim gibi görünüyor. Bağlantılı liste için örneğin,:

L = 1 X • L

(1 - X) • L = 1

L = 1 / (1 - X) = 1 X X² X³ ...

burada kullandığım güç serisi açılımı 1 / (1 - X) Tamamen haksız bir şekilde elde ilginç bir sonuç, yani bir L yazın ya da Nil veya içerdiği 1 öğe veya içerdiği elemanları 2, 3, vb.

Eğer ikili ağaçlar için yaparsak daha ilgi çekici olur

T = 1 X • T²

X • T² - T 1 = 0

T = (1 - √(1 - 4 • X)) / (2 • X)

T = 1 X 2 • X² 5 • X³ 14 • X⁴ ...

yine, kuvvet serileri genişleme kullanarak (Wolfram Alpha ile yapılır). Bu ifade ettiği çok açık olmayan (bana) aslında bu sadece bir ikili ağaç ile 1 element, 2 ikili ağaçlar ile iki eleman (ikinci unsur olabilir sol veya sağ dal), 5 ikili ağaçlar ile üç element vb.

Benim sorum - ben burada ne yapıyorum? Bu işlemleri haksız (tam olarak cebirsel veri türü Karekökü nedir?) gibi ama mantıklı sonuçlara yol açabilir. iki cebirsel veri türleri bölüm bilgisayar bilimi bir anlamı var mı, yoksa sadece işaretler kandırmaca mı?

Ve, belki daha da ilginci, bu fikirleri genişletmek için mi? Örneğin, tür keyfi işlevleri sağlar bu tür Cebir teorisi vardır, veya bir tür güç serisi bir temsile ihtiyacı var mı? Eğer fonksiyonların bir sınıfı tanımlayabilirsiniz, daha sonra fonksiyonların bileşimi herhangi bir anlamı var mı?

CEVAP
8 ŞUBAT 2012, ÇARŞAMBA


Yasal Uyarı: Bu çok ediyorum ⊥, pervasızca basitlik için bunları önemsemez. için önüne alındığında oldukça doğru çalışmıyor

Başlangıçtaki birkaç puan

  • Not bu "sendika" Evet, pek iyi bir dönem için Bir B burada ... özellikle a disjoint union iki tür, çünkü iki taraf ayırt bile kendi türleri aynı. Ne, daha yaygın terimi için sadece "gibi". sum türüdür

  • Tek tip, etkili bir şekilde, tüm birim türleri vardır. Onlar cebirsel manipülasyonlar altında aynı şekilde davranır ve daha da önemlisi, bilgi miktarı hala korunur.

  • Muhtemelen de sıfır bir tür istiyorum. Bir standart yok, ama en yaygın isim Void. Bir olan bir değeri olmadığı gibi sıfır olan değerler vardır.

Hala büyük bir operasyon burada eksik var ama birazdan alacağım.

Muhtemelen fark ettiğiniz gibi, Haskell ile Kategori Teorisi kavramları ödünç eğilimindedir, ve tüm yukarıdaki gibi çok basit bir yorumu vardır

  • Nesneleri A ve B olarak verilmişHask,×A B iki sağlayan (izomorfizma) benzersiz bir türüdür ürün projeksiyonlarıdosyalar: B×seçeneğini veeriyor: B her tür verilen B, C ve fonksiyonlar×seçeneklerini belirleyinf: C DEVAMLIDIRg: C seçeneğine B eşleşmeyi tanımlayabilirf &&& g: A, B, C seçeneğine×gibibütünler (f &&& g) dosyalar=fve aynı şekildeg. Parametricity evrensel özelliklerini garanti eder ve otomatik olarak isimleri daha ince benim tercihim size fikir verecektir. (&&&) operatör bu arada Control.Arrow, tanımlanır.

  • Yukarıda çift coproduct enjeksiyonları ile Bir BiçeriBir B seçeneğini veınr: Her tür verilen B, C ve fonksiyonları B uygulayalımf: C DEVAMLIDIRg: B → C, copairing tanımlayabilirsinizf ||| g: Bariz şekilde B Seçeneğine " C " tutun eşitlikleri. Yine parametricity zor bölümleri otomatik olarak en garanti etmektedir. Bu durumda, standart enjeksiyon sadece Left Right ve copairing fonksiyonu either.

Ürün ve toplam tür özelliklerini çok yukarıda elde edilebilir. Herhangi bir tek tip terminal bir nesne olduğunu unutmayınHaskve boş bir tür ilk bir nesnedir.

Söz konusu eksik işlemin geri dönen cartesian closed category kategori okları karşılık gelen exponential objects var. Oklarımız fonksiyonlar, nesneler tür * ile tür ve tür A -> B gerçekten de B gibi davranırBirtür cebirsel manipülasyon bağlamında. Eğer bu tutuklamanın neden açık değil, 32* *türü düşünün. Sadece iki olası girişleri ile, bu tür bir işlevi 33*, yani* 34 ** yazın iki değerlerine dönmesidir. Maybe Bool -> A için üç olası giriş ve ... Ayrıca, eğer cebirsel gösterimde kullanmak için yukarıdaki copairing tanımı başka bir ifadeyle, kimlik C inceleyinBir× CB= CBİR B.

Olarak içinnedenbu tüm mantıklı ve özellikle neden kullanımı, güç serisi açılımı haklı--not bu kadar yukarıda ifade eder "sakinleri" bir tür (örneğin, farklı değerlere sahip olan türü) için göstermek için cebirsel bir davranış. Bu bakış açısı açık yapmak için:

  • Ürün tipi 36* *bir değeri, her A B bağımsız olarak alınan temsil eder. Herhangi bir sabit değeri için a :: A yazın bir değerdir B her sakini için (A, B). Bu ders, kartezyen çarpımı ve ürün türünü nüfusu faktörleri nüfusu ürünüdür.

  • Topla tip 42 ** A ya da sol ve sağ dalları seçkin B bir değeri temsil eder. Daha önce de belirttiğimiz gibi, bu ayrık Birliği ve topla tür nüfus sayısı summands nüfusu toplamıdır.

  • Üstel tip 45* *tip değerleri B tip değerleri A bir eşleme temsil eder. Herhangi bir sabit değişken b :: B, herhangi bir değer A atanabilir; değer tipi B -> A alır böyle bir eşleme için her giriş eşdeğerdir bir ürün olarak kopyalar A B nüfus var, dolayısıyla beyan etme.

Hem de baştan çıkarıcı ilk tedavi türleri olarak ayarlar, bu da değil aslında iş çok iyi Bu bağlamda var ayrık Birliği yerine standart Birliği ayarlar yok açık sözlü kesişme ya da diğer birçok küme işlemleri, ve biz yok genellikle bakım seti üyelik (terk bu tip denetleyicisi).

Öte yandan, bu yapılar yukarıda çok zaman geçirmek hakkında konuşuyorsaymanüfus venumaralandırmabir tür olası değerleri yararlı bir kavram burada. Bu hızla yol bize enumerative combinatorics ve eğer size danışmak bağlantılı Vikipedi makale bulursun bir ilk şeyler yapar alır. "çiftler" ve "sendikalar" tam olarak aynı anlamda olarak ürün ve topla türleri tarafından yol generating functions, o zaman aynı için "dizileri" bu aynı Haskell'ın listeleri kullanarak tam olarak aynı tekniği yaptım.


Düzenleme:Oh, ve burada noktayı çarpıcı biçimde gösterir bence hızlı bir bonus. Ağaç türü T = 1 T^2 kimlik türetmek bir yorumda bahsettiğiniz açıkça yanlış olan T^6 = 1,. Ancak, T^7 = Tyoktutun ve ağaçların yedi dizilerini arasında doğrudan bir tanımlansın, cf inşa edilebilir. Andreas Blass's "Seven Trees in One".

×Edit 2:""İnşaat fikir daha, bölünme gibi kavramların ve diğer ilginç şeyler de dahil olmak üzere inşa eden diğer cevapları da this paper from the same author hoşunuza gidebilecek söz. bir tür türev konusunda

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Andytokkallos

    Andytokkallo

    27 Kasım 2007
  • DudeFromUkraine

    DudeFromUkra

    7 Ocak 2008
  • LounaTutorials

    LounaTutoria

    10 EYLÜL 2009