2015-08-25 13 views
6

Tip Aileleri öğreniyorum ve neden belirli bir durumda bir derleme zamanı hatası almıyor anlamaya çalışıyorum.Türü aileleri anlama

My tipi ailesi aşağıdaki gibi tanımlanır:

func1 :: (Typ (Label "la") (Label "lb")) => Label "la" -> Label "lb" -> String 
func1 = undefined 

func2 :: (Typ (Label "la") String) => Label "la" -> String -> String 
func2 = undefined 

Hem bu işlevler Tamam derlemek:

type family Typ a b :: Constraint 
type instance Typ (Label x) (Label y) =() 

Ben aşağıda iki işlevi vardır.

func1 türünü görüntülemeye çalıştığımda, doğru imzayı alıyorum. Ben func2 türünü görüntülemeye çalıştığınızda Ama ben hatayı aşağıdaki hata olsun

(Typ (Etiket "la") Dize)

Bu neden böyledir anlamak olamaz mı? Birisi anlayamama yardım edebilir mi?

import GHC.TypeLits (Symbol) 

data Label (a :: Symbol) 

Ve ekleyerek: Sonra func2

türünü sağlar

type instance Typ (Label x) String =() 

Edit

+0

Varsayımın nedeni, "Typ (Label x)" (Label y) "için bildirilen ancak" Typ (Label x) String "için değil) bildirilen bir örnek olmasıdır. 'Etiket' tanımı nedir? – ryachza

+0

'data Etiketi (l :: Symbol) =" Func2 "için bir derleme zamanı hatası almayı umuyordum ve bir çalışma zamanı hatası değil –

+3

[Bu bağlam bağlamında azaltma] (https://www.haskell.org/onlinereport/haskell2010/haskellch4.html#x10-910004.5.3). Bunu ghci'nin şikayet ettiği bir hata olarak adlandırıyorum: muhtemelen kullanıcı tarafından sağlanan tip imzalarında bağlam azaltımı yapmamalı. Tabii ki, eğer func2'yi gerçek bir programda kullanmayı denediyseniz, tabii ki, hiçbir bağlamı olmayan bir "ana" ye geri dönecek ve özellikle "Typ (Label" la ") olmasına izin verilmeyecektir. String 'bağlamında - bir tür hatası alırsınız. –

cevap

3

Bunu Label tanımı ile deyimiyle çoğaltmak başardı

Üzgünüm, endişeyi yanlış anladım. Anlayışım, kısıtlamanın tatmin edici olup olmadığını kontrol etmenin, bir örnek daha sonra eklenebileceğinden, aslında func2 kullanılmasına kadar ertelenmesidir.

func3 = func2 (undefined :: Label "la") "" 

derleme zamanında başarısız olmasına neden olur: ekleme Örneğin

. Bana bir Label "la" ve Stringve Typ (Label "la") String örneğidir zamanında de kapsam içindedir verirsen

Ben bir anlam yolu func2 diyerek olmasıdır, sana bir String vereceğiz. Ancak func2'un numaralı telefon numarasını öğrenmek için bir örneğe sahip olması gerekmiyor, eğer varsa numaralı telefonu kullanın.

+0

Evet @DanielWagner. Anlayışınız doğru. Tür hatası neden geciktiğiyle ilgileniyorum. –

+3

@PrasannaKRao "Neden gecikti" - bu bölüm kolaydır. Tatmin edilmemiş kısıtlamalarla ilgili şikayetlerin, ayrı bir derlemeyi desteklemek için mümkün olduğu kadar geciktirilmesi genel bir prensiptir. (Ayrı bir derleme ile, bir kısıtlamayı tatmin etmenin tüm yollarını bilmiyor olabilirsiniz.) Ama "ve daha uzak" bölümden emin değilim. –

+0

@PrasannaKRao Üzgünüm başlangıçta yanlış anladım ve cevabımı güncelledim. – ryachza