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
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
'data Etiketi (l :: Symbol) =" Func2 "için bir derleme zamanı hatası almayı umuyordum ve bir çalışma zamanı hatası değil –
[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. –