İ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
İ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.
HashMap yük faktörünün önemi nedir?...
ProjectTypeGuids önemi visual studio p...
Pearson korelasyon hesaplanması ve öne...
Yeni Başvuru Sınıfların önemi nedir?...
SQL Server 1/1/1753 önemi nedir?...