2017-07-31 86 views
6
ben aynı olacak şekilde

Tür imzalar ve Tip ailelerin

type family Rep a 

ve

type family Rep :: * -> * 

bekliyoruz, ancak

type family Rep a 
type instance Rep Int = Char 
-- ok 

type family Rep :: * -> * 
type instance Rep Int = Char 
-- Expected kind * -> *, but got 'Int' instead 

Sadece bir sendeledi mı bir fark var gibi görünüyor

Haskell uzantısı böcek, ya da bu davranışa bir nokta var mı?

+6

Buradaki nokta, tür aileler 'tip düzey işlevler' değildir. Onlar 'tip aileler'. Değer düzeyli desen eşleştirmesi ile tip aile örneği bildirimleri arasındaki sözdizimsel benzerlikleri bir rastlantı olarak görmelisiniz - ikisi birbirinden tamamen farklı anlamlara sahiptir (örn. Kurucuda eşleştirilen değer düzeyi işlevini yazmayı deneyin Sol - a -> Ya ab '). Farkın asgari bir örneğine zaten şahit oldunuz. 2. tip aile, sadece tek bir örneğe sahip olabileceğinden, temel olarak sadece bir tür eşanlamlıdır. 1, uygun tipte bir ailedir. – user2407038

+0

Keşke “tip-seviye fonksiyon” ile “tip ailesi” arasındaki farkı açıklamanın basit bir yolunu bulsaydım ama yapmam. Bu fark, 1. tip ailenin kısmen uygulanamayacağı gerçeğini ortaya çıkarmaktadır (ikinci aşamada elbette 2, ancak 2. argümanın kullanılması, 0 argümanı aldığından, doymuş bir uygulamadır) - diğer bir deyişle 1. tip Aile, Haskell tipi sistemde kendisine tahsis edilebilecek bir türe sahip değildir. – user2407038

cevap

12

Evet, ince bir fark var.

Kabaca, diyelim ki, F Int[], Maybe gibi bir injektif tip yapıcısı type family F a :: *->* devletler olduğunu. Bu, aşağıdaki kodunu kontrol tip derleyici tarafından faydalanılır:

type family F a :: * -> * 

-- these three examples can be removed/changed, if wished 
type instance F Int = [] 
type instance F Char = Maybe 
type instance F Bool = (,) String 

foo :: (F Int a :~: F Int b) -> (a :~: b) 
foo Refl = Refl 

üzerinde kontrol yazmak için derleyici F Int a ~ F Int b İnjektif izler ki, a ~ b ima gerçeğini kullandı. Aşağıdaki yasal hale beri

Bunun yerine, type family F a b :: * ilan F Int ait İnjektiflik garantilemez.

type family F a b :: * 
type instance F Int a =()