Oluşturduğum veri türü için örnek bildirimi yaparken bir tür bağlam kullanmıştım.Haskell Tür Bağlamı, işlevler için gerekli bildirimler için gerekli
data Set a = Insert a (Set a) | EmptySet
instance (Show a) => Show (Set a) where
show x = "{" ++ show' x ++ "}" where
show' (Insert x EmptySet) = show x
show' (Insert x xs) = show x ++ ", " ++ show' xs
instance Eq a => Eq (Set a) where
(Insert x xs) == (Insert y ys) = (x == y) && (xs == ys)
Yani şimdi, ben o kadar olduğu gibi, benim Seti türü kullanmak tanımlayan fonksiyonların tümüne Denklem tipi bağlam eklemek zorunda, yoksa bir tür hatayı alıyorum:
memberSet::Eq a =>a->Set a->Bool
memberSet _ EmptySet = False
memberSet x (Insert y ys)
| x == y = True
| otherwise = memberSet x ys
subSet::Eq a=>Set a->Set a->Bool
subSet EmptySet _ = True
subSet (Insert a as) bs
| memberSet a bs = subSet as bs
| otherwise = False
hatası Görünüşe göre:
No instance for (Eq a)
arising from a use of `=='
In the expression: (x == y)
In a stmt of a pattern guard for
an equation for `memberSet':
(x == y)
In an equation for `memberSet':
memberSet x (Insert y ys)
| (x == y) = True
| otherwise = memberSet x ys
Failed, modules loaded: none.
Bu ne anlama geliyor? Neden bu hatayı alıyorum? Örnek beyanı verdikten sonra, Haskell, "memberSet" ve "subSet" işlevlerimde "==" ile karşılaştırılan şeylerin otomatik olarak "Eq?" Örneklerini kontrol edeceğini otomatik olarak doğrulayabileceğimi düşündüm. netlik için
Düzenleme:
Sorunum tip bağlamları "memberSet" ve neden gerekli olduğunu anlamak kalmamasıdır "alt küme". Onları böyle kaldırırsam, derleme yapmaz. senin örnek beyanı diyor ne
memberSet::a->Set a->Bool
memberSet _ EmptySet = False
memberSet x (Insert y ys)
| x == y = True
| otherwise = memberSet x ys
subSet::Set a->Set a->Bool
subSet EmptySet _ = True
subSet (Insert a as) bs
| memberSet a bs = subSet as bs
| otherwise = False
Benim için yazım denetimi yaptığınız kod.Ne dışarı çıkıyorsun? – bdonlan
Verilen kodun iyi göründüğünden, kapsamı veya adları içeren bir tür oldukça ince bir hatadan şüpheleniyorum. –
Sorumu belirsizdi. Kod derler. Neden "memberet" ve "subset" de düzenleyeceğim tür bağlamıyla derlemeyeceğini merak ediyorum. –