SORU
28 HAZİRAN 2012, PERŞEMBE


İzomorfik fonksiyonlarının önemi

Kısa Bir Soru:Programlama izomorfik fonksiyonları (yani fonksiyonel programlama) önemi nedir?

Uzun Soru:Fonksiyonel programlama ve Kategori Teorisi kavramları arasında bazı ciddi zaman-zaman duydum lingo bazı esinlenerek çizmeye çalışıyorum. ""O bir şey o zaman hafif beton içine lingo. paketini çalışıyorum aslında O zaman ne halt-ben sadece ben konuşurken bir anlayış ile lingo kullanmak mümkün olacak. Her zaman güzel.

Hep duyarım bu terimlerden biriİzomorfizmBu konuda akıl işlevler veya işlev besteleri arasında denklik olmadığını düşünüyorum. Merak ediyordum biri olabilir sağlamak bazı araçlarla bazı ortak kalıpları nerede özelliği izomorfizma geliyor kullanışlı (işlevsel programlama), ve herhangi bir yan ürün elde gibi derleyici en iyi duruma getirmeleri mantık hakkında izomorfik fonksiyonları.

CEVAP
28 HAZİRAN 2012, PERŞEMBE


İzomorfizma kategori teorisi tanımı nesneler hakkında bir şey söylüyor gibi izomorfizma için upvoted cevabı ile küçük bir sorun var. Neden anlamak için tanımını gözden geçirelim.

Tanım

Bir izomorfizma morfizmaları (fonksiyonlar gibi), f g, böyle bir çift

f . g = id
g . f = id

Bu morfizmaları sonra "ıso"morfizmaları denir. Bir sürü insan "işlevini ifade eder izomorfizma ve" nesne. tip III: eğer bu kaçırma Ancak, bağlandıkları nesneler olduğunu söyleyebilirim "diğer cevabı değerlendirdi.", izomorfik

İzomorfizm tanımı nedir (.)demiyor dikkat edin, id, ya = olmalıdır. Tek şart, her ne iseler, onlar da kategori yasaları karşılayan

f . id = f
id . f = f
(f . g) . h = f . (g . h)

Kompozisyon (yani (.)) katılan tek tip III: eğer iki morfizmaları ve bir tür gösterir id "kimlik" geçiş. Bu ise bizim izomorfizmler kimlik için id, tip III: eğer iptal olursa o zaman birbirlerinin tersleri olarak düşünebilirsiniz anlamına gelir.

Bu morfizmaları işlevleri olduğu özel durum için, id kimlik fonksiyonu olarak tanımlanır:

id x = x

... ve kompozisyon olarak tanımlanır:

(f . g) x = f (g x)

... ve iki işlevi eğer onlar kimliğini onları oluştururken id iptal fonksiyonu eğer izomorfizmler.

Morfizmaları karşı nesneler

Ancak, iki nesne izomorfik olabilir birden çok yolu vardır. İki tür aşağıdaki verilen örnek için:

data T1 = A | B
data T2 = C | D

Aralarında iki izomorfizmler vardır:

f1 t1 = case t1 of
    A -> C
    B -> D
g1 t2 = case t2 of
    C -> A
    D -> B

(f1 . g1) t2 = case t2 of
    C -> C
    D -> D
(f1 . g1) t2 = t2
f1 . g1 = id :: T2 -> T2

(g1 . f1) t1 = case t1 of
    A -> A
    B -> B
(g1 . f1) t1 = t1
g1 . f1 = id :: T1 -> T1

f2 t1 = case t1 of
    A -> D
    B -> C
g2 t2 = case t2 of
    C -> B
    D -> A

f2 . g2 = id :: T2 -> T2
g2 . f2 = id :: T1 -> T1

Bu yüzden o daha iyi açıklar izomorfizma açısından belirli işlevleri ilgili iki nesne yerine iki nesne, beri orada mutlaka bir benzersiz çift fonksiyonlar arasında iki nesneleri karşılayan bir izomorfizma yasaları.

Ayrıca, işlevleri ters çevrilebilir olması için yeterli değildir unutmayın. Örneğin, aşağıdaki fonksiyon çiftleri izomorfizmler değildir:

f1 . g2 :: T2 -> T2
f2 . g1 :: T2 -> T2

Hiçbir bilgi f1 . g2, oluştururken kayıp olsa bile, eğer son durumu aynı tür varsa bile geri orijinal durumuna geri dönmek, yok.

Ayrıca, izomorfizmler somut veri türleri arasında olmak zorunda değil. İşte iki kurallı izomorfizmler bir örnek beton cebirsel veri türleri arasında değildir ve bunun yerine sadece işlevleri ile ilgilidir: curry uncurry:

curry . uncurry = id :: (a -> b -> c) -> (a -> b -> c)
uncurry . curry = id :: ((a, b) -> c) -> ((a, b) -> c)

İzomorfizmler için kullanır

Kilise Kodlama

İzomorfizmler birini kullanın Kilisesi-kodlama fonksiyonları gibi veri türleri için. Örneğin, 33* *forall a . a -> a -> a dönmesidir

f :: Bool -> (forall a . a -> a -> a)
f True  = \a b -> a
f False = \a b -> b

g :: (forall a . a -> a -> a) -> Bool
g b = b True False

f . g = id g . f = id doğrulayın.

Yararı Kilisesi kodlama veri türleri olduğunu bazen daha hızlı koşun (çünkü Kilise-kodlama devamı-geçen stili) ve bunlar uygulanan diller bile yok dil desteği için cebirsel veri türleri.

Uygulamaları Çevriliyor

Bazen bir kitaplık uygulaması için bazı özellik bir kitaplık uygulaması karşılaştırmak için çalışır, ve eğer izomorfik olduklarını ispat ederseniz, o zaman eşit derecede güçlü olduğunu kanıtlamak. Ayrıca, izomorfizmler diğer içine bir kütüphane çevirmek için nasıl açıklar.

Örneğin, bir functor imza bir monad tanımlama yeteneği sağlayan iki yaklaşım vardır. Serbest monad, free paketi tarafından sağlanan ve diğer operasyonel anlambilim, operational paketi tarafından sağlanır.

Eğer iki temel veri türleri bakarsanız, farklı, özellikle ikinci kurucular görünüyorlar:

-- modified from the original to not be a monad transformer
data Program instr a where
    Lift   :: a -> Program instr a
    Bind   :: Program instr b -> (b -> Program instr a) -> Program instr a
    Instr  :: instr a -> Program instr a

data Free f r = Pure r | Free (f (Free f r))

... ama aslında dönmesidir! Bu her iki yaklaşım da aynı derecede güçlü ve herhangi bir kod bir yaklaşım ile yazılmış mekanik olarak diğer yaklaşım izomorfizmler kullanarak tercüme edilebilir anlamına gelir.

Olmayan izomorfizmler fonksiyonları

Ayrıca, izomorfizmler fonksiyonları sınırlı değildir. Aslında kategori sürü vardır Haskell Category herhangi bir Ve için tanımlanır. Bu daha yararlı morfizmaları yerine veri türleri açısından düşünmek gerekir.

Örneğin, Lens türü (data-lens) lensler oluşturmak ve kimlik objektif bir kategori oluşturur. Yani yukarıda veri türünü kullanarak, izomorfizmler iki lens tanımlayabiliriz:

lens1 = iso f1 g1 :: Lens T1 T2
lens2 = iso g1 f1 :: Lens T2 T1

lens1 . lens2 = id :: Lens T1 T1
lens2 . lens1 = id :: Lens T2 T2

Oyunda iki izomorfizmler olduğunu unutmayın. Bir izomorfizma için kullanılan yapı her lens (yani f1 g1) (ayrıca bu yüzden inşaat fonksiyonu çağrılır iso), ve sonra lensler kendileri de izomorfizmler. Not Yukarıdaki formülasyonu, bileşimi (.) kullanılmaz fonksiyon kompozisyon ama oldukça objektif, kompozisyon, ve id değil kimlik işlevi, ancak bunun yerine kimlik lens

id = iso id id

Eğer iki lensler oluşturmak, sonuç kimlik lens farksız olması gerektiği anlamına gelmektedir.

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • androidandme

    androidandme

    10 Mart 2009
  • Damien Walters

    Damien Walte

    20 AĞUSTOS 2006
  • Munchkin the Teddy Bear

    Munchkin the

    30 EYLÜL 2011