2012-09-17 10 views
22

Sorum örnek şeklinde açıklamak muhtemelen en kolay:Eşleştirme 7.6

burada ikinci örneği reddedilir
type family Take (n :: Nat) (xs :: [k]) :: [k] 
type instance Take 0  xs  = '[] 
type instance Take (n+1) (x ': xs) = x ': Take n xs 

olsa da, (+) çünkü bir tür aile kendisi olmak argümanlarda kullanılamaz. Ancak, Succ ya da genellikle Nats'i eşleştirmek için kullanılan herhangi bir şey yok gibi görünüyor.

Yani, bu ifade edilebilir; ve eğer öyleyse, nasıl?

Güncelleştirme. GHC.TypeLits numaralı isZero ve isEven işlevlerinin “Türleri yıkmak” başlığı altında olduğunu fark ettim. Bir şekilde tip düzeyinde kullanılmaları mı gerekiyor? Şüpheliyim… ama çoğunlukla nasıl yapılacağını göremiyorum. :)

+1

Doğru. Bu kodu kontrol edebilmek için GHC 7.6'yı yeni yükledim ve aşağıdaki yorumlarınızda bahsettiğiniz her iki konu da GHC tarafından işaretleniyor. Özür. (Cevabımdaki 'sil' düğmesine bastım, bu yüzden şimdi doğrudan yorum yapamam). – macron

+1

Argümanların işe yarayabileceği gibi sonlandırma koşullarını kodlamak gibi görünüyor (bkz. Https://gist.github.com/a39ce17ca47798b0f0ef), ancak n == 1 olduğunda başarılı görünmektedir. Bunu 7.6'da değil, tip-nats dalında denedim, yani ymmv. –

+0

'isZero' ve' isEven' işlevleri, aynı düzeyde adlandırılmış GADT'leri oluşturur ve bunlar, düzey düzeyindeki tür düzeyinde yüklemeye erişim sağlar. Başka bir deyişle, istediğiniz bir eşleme işlevini, bir tür işlev yerine, düzenli bir terim düzeyinde işlevinde gerçekleştirmenin bir yolu. : [ –

cevap