Haskell'de Neden Enum'un bir alt sınıfı sınırlı değil


9

Herhangi bir Sınırlı örneğin Enum'un aklı başında bir uygulaması olmalı gibi görünüyor. Şahsen bir karşı örnek düşünemiyorum, ancak eğer birisi patolojik olmayan biriyle gelirse, neden böyle olmadığını anlayacağım.

:iİki tip sınıfta yaptığından , şu anda standart kütüphanede tek istisna, Sınırlı olan ancak Numaralandırmalar olmayan tuples için olduğu görülüyor. Bununla birlikte, herhangi bir Sınırlı demet, son öğeyi arttırarak ve sonra maxBound'a geldiğinde etrafa sararak akılcı bir şekilde Numaralandırılabilir olmalıdır.

Bu değişiklik muhtemelen de ekleyerek yer alacağı predBve nextBNumaralandırma değerlerine boyunca hareketlerini yol döngü / kasanın veya sınırlandırılmış için öyle bir şey. Bu durumda toEnum 0 :: (...)eşit olacaktır(toEnum 0, toEnum 0, ...) :: (...)


3
Bunu gerçekten yetkili olarak cevaplayamıyorum ancak 0 ile 1 arasındaki tüm gerçek sayıların aralığını göz önünde bulundurun. Açık alt ve üst sınırları vardır, ancak sayılamayan sonsuz üyeleri vardır.
Doval

@Daha adil bir nokta. Ancak aynı şey genel olarak tüm gerçek sayılar için de söylenebilir (sayılamayacak kadar sınırsız üyeler), ancak Double/ Floatve tüm benzer türler Enumyine de uygulanır , sadece succ = (+ 1)ve yaparlar fromEnum = truncate. Haskell'in yolu aslında pratik bir perspektiften mantıklıdır, aksi halde [0, 0.5 ..] ve benzerleri işe yaramaz, bu yüzden Haskell Enum söz konusu olduğunda sayılabilirlik konusunda endişelenmiyor gibi görünüyor.
noktalı virgül

1
Ben farkında değildim succolduğunu (+1). Bunun nedeni, garip Doubleve Floatsonsuz hassasiyet var ve bu nedenle yok olan enumerable - succ1 olarak tanımlanmıştı olabilirdi ULP .
Doval

2
@Davunma Bence bunun nedeni, Haskell çekirdek ekibinin [1 ..] 'in Ints ile aynı anlama geldiği anlamına geliyor.
noktalı virgül

@semicolon çiftler ve şamandıralar Gerçek sayılar değildir (örneğin, kesinliği kaybetmeden PI'yi bir çiftte saklayamazlar), bu yüzden numaralandırılabilirler
jk.

Yanıtlar:


8

Sevdiğim pratik bir örnek, programlama dilleri dünyasından geliyor: bir OO sistemindeki türler kümesi sınırlı ve ayrık ancak numaralandırılamıyor ve kısmen sıralı ama tamamen sıralı değil.

Söz konusu kısmi sıralama alt tip ilişkisidir <:. Daha sonra üst sınır en üst tür olacaktır (C # çağrıları objectve Scala çağrıları Any) ve alt sınır alt tür olacaktır (Scala'nın Nothing; C # / Java'nın konuşacak eşdeğeri yoktur).

Ancak, tür sistemindeki tüm türleri numaralandırmanın bir yolu yoktur, bu nedenle bir yazamazsınız instance Enum Type. Bu açık olmalıdır: kullanıcılar kendi türlerini yazabilir, böylece önceden ne olacaklarını bilmenin bir yolu yoktur. Herhangi bir programdaki tüm türleri numaralandırabilirsiniz, ancak tüm sistemde numaralandıramazsınız.

Benzer şekilde, (alt tiplemenin belirli bir makul tanımına göre) <:, refleksif, geçişli ve antisimetriktir, ancak toplam değildir . İlgisiz olan çift türleri vardır <:. ( Catve Dogher ikisi de alt türleridir Animal, ancak ikisi de diğerinin alttürü değildir.)


Basit bir OO dili için bir derleyici yazdığımızı varsayalım. Sistemimizdeki türlerin gösterimi:

data Type = Bottom | Class { name :: String, parent :: Type } | Top

Ve alt tip ilişkisinin tanımı:

(<:) :: Type -> Type -> Bool
Bottom <: _ = True
Class _ _ <: Bottom = False
Class n t <: s@(Class m _)
    | n == m = True  -- you can't have different classes with the same name in this hypothetical language
    | otherwise = t <: s  -- try to find s in the parents of this class
Class _ _ <: Top = True
Top <: Top = True
Top <: _ = False

Bu da bize süper tip bir ilişki veriyor.

(>:) :: Type -> Type -> Bool
t >: s = s <: t

İki türün en az üst sınırını da bulabilirsiniz,

lub :: Type -> Type -> Type
lub Bottom s = s
lub t Bottom = t
lub t@(Class _ p) s@(Class _ q) =
    | t >: s = t
    | t <: s = s
    | p >: s = p
    | t <: q = q
    | otherwise = lub p q
lub Top _ = Top
lub _ Top = Top

Alıştırma: sınırlı bir tam poset altında ve altında iki yol Typeoluşturduğunu gösterin .<:>:


Harika teşekkürler! Bu sorumu tamamen cevaplıyor ve ayrıca Ord hakkındaki takip sorumu cevaplıyor. Eq'nin benzer sorunları olur mu? Eşit olmayan bir türün bir maxBound veya minBound olabileceği yerler. Bu durumda Cat == Köpek sadece farklı sınıflar olduğu için yanlış döndürür mü yoksa ağaç konumu diğerinin üstüne ya da altına koymuyorsa kararsız mı olur?
noktalı virgül

Bir düzen bir eşitlik anlamına gelir - sadece tanımlayın x == y = x <= y && y <= x. Eğer bir Posetsınıf tasarlasaydım class Eq a => Poset a. Hızlı bir Google, başkalarının da aynı fikre sahip olduğunu doğrular .
Benjamin Hodgson

Üzgünüm sorum belirsizdi. Demek istediğim, Bounded, Ord'u ima etmese bile Eq'yi ima edip etmediğiydi.
noktalı virgül

@semicolon Yine iki sınıf arasında bir ilişki yoktur. Düşünün data Bound a = Min | Val a | Maxbir tür arttıran, abirlikte +∞ve -∞öğeleri. Inşaat Bound aile her zaman bir örnek yapılabilir, Boundedancak sadece altta yatan tür aise eşit olabilir
Benjamin Hodgson

yeterince adil. Ben bir örnek almak fonksiyonları ve tip dönüş değerleri olabilir sanırım Double, const (1/0)bir maxBoundve const (negate 1/0)bir minBoundama \x -> 1 - xve \x -> x - 1kıyaslanamaz.
noktalı virgül

4

Çünkü operasyonlar bağımsızdır, bu yüzden onları bir alt sınıf ilişkisiyle birleştirmek size hiçbir şey satın almaz. Diyelim ki Bounded, Doublesmaks. Ve min arasında kısıtlanmış olan, ancak herhangi bir işleme gerek duymadığınız özel bir tür oluşturmak istiyorsunuz Enum. Eğer Boundedbir alt sınıf olsaydı Enum, sadece derlemek için tüm fonksiyonları yerine getirmelisiniz.

Makul bir uygulama Enumya da başka tipler için makul bir uygulama olup olmadığı gerçekten önemli değil . Aslında buna ihtiyacınız yoksa, uygulamaya zorlanmamalısınız.

Bunu say Ordve ile karşılaştırın Eq. Orada, Ordişlemler Eqolanlara bağlıdır , bu nedenle çoğaltmayı önlemek ve tutarlılığı sağlamak için alt sınıfa ihtiyaç duyulması mantıklıdır.


1
Bu durumlarda, tanımın bir parçasıdır. Tüm monadlar aynı zamanda tanımı gereği uygulamalı ve işlevlidir, bu yüzden monad "sözleşmesini" diğerlerini yerine getirmeden yerine getiremezsiniz. Bunun temel bir ilişki mi yoksa dayatılan bir tanım mı olduğunu bilecek kadar matematiğe yeterince aşina değilim, ama her iki durumda da şimdi ona takılı kaldık.
Karl Bielefeldt

6
@semicolon belgelerineBounded "Ord tamamen de üst ve sınır düşürebilir sıralanmaz türleri beri sınırlanmış bir üst sınıf değildir." diyor
Benjamin Hodgson

1
@BenjaminHodgson Kısmen sipariş edilen türleri bile düşünmedim. Patolojik olmayan bir örnek için ve belgelerin alıntılanması için +1.
Doval

1
@semicolon Bilgisayar dünyasından kısmi bir sipariş örneği, OO dillerinde alt tip olabilir. Yazma <:için bir alt tipi olan , ∀ T S. T <: S ∨ S <: Ttutmaz (örneğinint !<: bool ∧ bool !<: int ). Bir derleyici yazıyorsanız, bununla karşılaşırsınız.
Benjamin Hodgson

1
@BenjaminHodgson ah ok. Örneğin, A, B ve C'nin bir süper sınıfı ve D, B ve C'nin bir alt sınıfı ise, B ve C karşılaştırılamaz, ancak A ve D max / dk mıdır?
noktalı virgül
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.