2013-07-24 18 views
6

Haskell's type-defaulting rules varsayılan değişken bir tür kısıtlamaları ile (C1-a, ..., Cn) edin:Genelleştirilmiş tip varsaymak kuralları

  • değişken bir başka kısıtlamalar görünür tipi
  • Tüm sınıflar Ci standarttır. pratikte bu her zaman işe zaman belirsiz olduğunda türünü belirtmek zorunda olduğu anlamına gelir: sınıflar Ci ait
  • en az bir

Bu bana mantıklı ama aynı zamanda çok sınırlı olduğunu sayısalsa özel sınıflar ile. Örneğin, bu derleme değildir: sınıfları tek parametre tipi sınıfları arasında

  • tüm:

    class (Show a) => MyShow a where 
        myShow :: a -> String 
        myShow = show 
    
    instance (MyShow a) => MyShow (Maybe a) where 
        myShow Nothing = "Nothing" 
        myShow (Just x) = "Just " ++ (myShow x) 
    
    main = print $ myShow Nothing -- ambiguous 
    

    GHCi bu şekilde bu kurallar kümesi uzanmaktadır. sınıfları Ci arasında

  • en az bir sayısal veya , Eq veya Ord Göster görünümüdür.

ve GHC ExtendedDefaultRules bu kuralları sağlayacak denilen bir uzantı var. Ancak, bu uzantı çok spesifiktir: sadece GHC'de ve standart sınıflarda çalışır. Örneğin, standart kütüphaneyi kullanmayan kütüphaneler düşünebilir. Bu durumda GHCi uzantısı çalışmayacak.

Soruma göre: Haskell'in GHCi gibi yazım kurallarını genişletmenin tek yolu derleyici uzantılarıyla mı? Ve daha genel: Haskell 98'deki kısıtlamalara ilişkin bazı kurallara dayanarak tip varsayılanı tanımlamanın bir yolu var mı?

+3

İstediğiniz şeyi yapmanın yolu yoktur. İyi bir tasarıma sahip olursanız, hepimiz kulak oluruz. Geçerli tip varsayılanı bir siğildir. gibi – augustss

+1

şey: 'örneği (MyShow a) => MyShow (Belki) (Int) varsaymak .... ' . Derleyici, türün belirsiz olup olmadığını ve bu durumda varsayılanı kontrol edebilir. Yukarıdaki durumda hiçbir şey tip Belki Int. Elbette sadece kısıtlamalara uygun tiplerde varsayılan değer alabilirsiniz. – mariop

+1

@mariop Bu fikirden heyecan duyduğunuzu anlıyorum, ama şu anda biraz yarım pişmiş görünüyor. Üzerinde düşünülecek çok şey var, örneğin: Farklı varsayılan değerlere sahip olan birçok kısıtlama varsa ne yapmalısınız? Kütüphane kullanıcıları bir kütüphanenin ihtiyaçlarını nasıl karşılayacaklarına dair ön seçim seçeneklerini nasıl etkileyebilirler? Örnekler varsayılan yönergeleri eklemek için neden kurallı doğru yer? Çözümünüz çok parametreli tip sınıflarına (ve fundeps ve tip ailelere) genelleştirilebilir mi? Eminim, tam bir teklifin de ele alması gerekecek pek çok zor soru vardır. –

cevap

6

İstediğiniz şeyi yapmanın bir yolu yoktur.

Mevcut durum tasarım tarafından fakirleştirilmiştir. Fikir, iyi bir tasarıma sahip olduğumuzda gelecekte genişletilebilecek bir şey yapmaktı.