SORU
8 Ocak 2010, Cuma


Fonksiyonel programlamada, bir functor nedir?

Dönem boyunca 'Functor' birkaç kez fonksiyonel programlama konusunda çeşitli makaleler okurken, ama yazarlar genellikle okuyucu zaten terim anladığını varsayıyorum geldim. Etrafında web görünümlü ya da aşırı teknik açıklamalar (Wikipedia article) ya da son derece muğlak açıklamalar (bu Funktorlar bölümüne ocaml-tutorial website) sağlamıştır.

Birisi lütfen bu terimi tanımlamak, açıklamak ve Funktorlar oluşturulur ve nasıl kullanıldığını gösteren bir örnek sunmak olabilir?

Edit: Vadeli arkasındaki teori ile ilgileniyorum ederken, kavramının uygulanması ve pratik kullanımı konusunda benden daha teoride daha az ilgileniyorum.

2 düzenleyin: Çapraz terminoligy biraz var gibi görünüyor: özellikle C . işlevsel programlama, fonksiyon nesneleri değil, Funktorlar bahsediyorum

CEVAP
8 Ocak 2010, Cuma


Kelime "functor" matematik çok genel, çok soyut bir kolu olan kategori teorisi geliyor. En az iki farklı şekilde işlevsel dil tasarımcıları tarafından ödünç olmuştur.

  • Diller ML ailede, bir functor bir parametre olarak bir veya daha fazla diğer modülleri gereken bir modül. Gelişmiş bir özellik olarak kabul edilir, ve en başından programcılar ile zorluk var.

    Örnek olarak uygulama ve pratik kullanabilirsiniz tanımlamak en sevdiğin formu dengeli ikili arama ağacı ilk ve son kez olarak bir functor ve alacak parametre olarak bir modül sağlar:

    • İkili ağaç kullanılan anahtar türü

    • Anahtarları üzerinde toplam-sıralama fonksiyonu

    Bunu yaptıktan sonra, aynı dengeli ikili ağaç uygulanması sonsuza kadar kullanabilirsiniz. (Değer türü kayıtlı ağaçtır genellikle sol polimorfik-ağaç gerek yok bakmak değerleri dışında bir kopyasını etrafında ise ağaç kesinlikle ihtiyaçlarına karşılaştırır anahtarları, aldığı karşılaştırma işlevi eşleme parametresi.)

    ML funktorlar başka bir uygulama layered network protocols. Link için gerçekten müthiş kağıt tarafından CMU Fox grubu; nasıl kullanılacağını gösterir funktorlar için inşa daha karmaşık protokol katmanları (TCP) tür basit katmanları (IP ya da hatta doğrudan Ethernet üzerinden). Her katman bir parametre olarak altındaki katmanla götüren bir functor olarak uygulanır. Yazılımın yapısı aslında katmanları sadece programcı zihninde varolan aksine insanların sorun hakkında düşünme tarzını yansıtır. Bu çalışma yayınlandığında, 1994 yılında, büyük bir anlaşma oldu.

    Eylem ML funktorlar vahşi bir örneğin kağıt görebiliyordu iş funktorlar (yani, korku) yayınlanabilir bir örnek içeren ML Module Mania,. ML modülleri sistem parlak, net, saydam bir açıklama için (modüller diğer tür karşılaştırmalar ile), Xavier Leroy parlak 1994 alarmları tarafından kağıt Manifest Types, Modules, and Separate Compilation ilk birkaç sayfa okuyun.

  • Bazı ilgili saf fonksiyonel dil Haskell, ve, Functortipi sınıf. Bir tür bir sınıf (ya da daha teknik olarak, "bu tür beklenen bazı davranış ile belirli işlemleri sağlar." türü sınıfı) bir örneği türüne ait T eğer varsa sınıf Functor ait bir tür gibi toplama davranışı

    • Türü T koleksiyon öğesi türü olarak düşünmek gerekir hangi başka bir türü üzerinde parametreli. Tam koleksiyon yazarsanız tamsayılar içeren iseniz, *, *8T IntT String, dizeleri gibi bir şey, ya da sırasıyla Booleans. Eğer öğe türü bilinmiyor, bir olarak yazılırtype parametresia, T a gibi.

      Örnekler listeleri (sıfır veya daha fazla öğe türü a) Maybe tipi (sıfır veya bir element türü a), ayarlar unsurları türü a, dizi elemanlarının türü a, her türlü arama ağaçları içeren değerlerin türü a ve çok başkalarını düşünüyorum.

    • Diğer özelliği T tatmin olan bir fonksiyon türü a -> b (fonksiyon öğeleri), sonra dışarı çıkarmak için bu işlevi ve ürün ile ilgili fonksiyon üzerinde koleksiyon. Operatör Functor yazın sınıftaki her türü tarafından paylaşılan fmap ile bunu. Operatör aslında tip Int -> Bool ile 21 ** bir işlevi varsa, o kadar dolup taştı

      fmap even
      

      çok güzel şeyler yapabilecek bir işlevde

      • Boolean değerleri listesine tamsayılar listesi dönüştürmek

      • Mantıksal bir ağaca tamsayılar bir ağaca dönüştürmek

      • Nothing Just False 26 Nothing dönüştürün

      Haskell, bu özellik fmap türüne vererek ifade edilir:

      fmap :: (Functor t) => (a -> b) -> t a -> t b
      

      biz şimdi küçük bir "Functor sınıfındaki herhangi bir türü." anlamına gelen t nerede

    Uzun lafın kısası, Haskellbir functor hangi unsurlar üzerinde bir fonksiyon verilir, fmap geri koleksiyonları bir işlev verecektir koleksiyon türüdür. Tahmin edebileceğiniz gibi, bu Haskell standart kütüphanenin bir parçası olarak kutsanmış, bu yüzden yaygın olarak kullanılmaması, bir fikir.

Her zamanki gibi, insanlar yeni, kullanışlı soyutlamalar icat etmeye devam edin ve içine bakmak isteyebilirsinizuygulamalıkendisi için iyi bir referans kağıdı Connor McBride Applicative Programming with Effects ve Ross Paterson denebilir funktorlar,.

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • DJAndrewRyan

    DJAndrewRyan

    22 Ocak 2007
  • NightShader1

    NightShader1

    25 Temmuz 2006
  • stokelycalm

    stokelycalm

    28 Aralık 2010