2010-03-13 17 views

cevap

9

Aşağıdaki sınıfların örneklerini haskell 98: Eq, Ord, Enum, Ix, Sınırlı, Oku ve Göster olarak alabilirsiniz.

ghc uzantılarını kullanarak, şu sınıfların örneklerini de elde edebilirsiniz: Tip, Veri, Functor, Katlanabilir ve Dönüştürülebilir. Ayrıca, bir yeni türün, uygulama türünden örnekleri türetmesini sağlayan bir ghc uzantısı da vardır.

Bu tür sınıf hakkında özel bilgi sahibi olmadan gerekli işlevleri nasıl üreteceğini bilmeyecek basit sebepten dolayı keyfi sınıf örnekleri elde edemezsiniz.

+0

Fakat GHC bazı basit durumları halledebilir. Newtype Bar = Bar Foo ve Foo'nun bir Quux örneğine sahipseniz, GeneralizedNewtypeDeriving sizin için Bar için Quux örneğini türetebilir. Tabii ki, bu sadece önemsiz bir unwrapping, ama hiçbir şeyden daha iyidir. – jrockway

6

Derleyicinin sizin için nasıl türetileceğini bilmesi bakımından belirli sınıflarla sınırlısınız. Bir önişlemci veya Template Haskell kullanarak, belirli türler için işlevlerin uygulanması için genel yaklaşımları biliyorsanız, yeni türetme mekanizmalarını kodlayabilirsiniz.

6

Diğer iki cevap doğrudur. Fakat daha fazlasına ihtiyacınız varsa, daha fazla işleyebilecek bilgisayar korsanları üzerinde bazı paketler var. Kaynak kodunu doğrudan (uyumluluk için) oluşturabileceğiniz veya derleme zamanında yapmak için Template Haskell'e bağlayabileceğiniz için Data.Derive'u çok seviyorum. Çok çeşitli sınıflar zaten desteklenmektedir ve kendi başına destek eklemeniz çok kolaydır. Özet:

+0

Şimdi bunu geri alıyorum. O zamanlar kendi başıma destek vermeye çalışmamıştım, ama kolay olduğunu düşündüm. Değil; kütüphaneyi anlattığım şeyden yeniden derlemeyi içerir. Ama yine de yerleşik destek güzel ve eksiksiz. – luqui

4

:-) lanet ince kütüphane için reklam zift Don'un cevabı eklemek için: veri türleri için özel işlevler kaynaklanan generic programming denilen ve bu konuda bir lot of literature yoktur. Önişlemciler ve Şablon Haskell tek çözüm değildir; Diğer seçenekler için literatür listesi sunan genel bakış belgelerinden birine bakın.