Bu özel kod bölümünün amacı, 'daki tüm öğeleri saymadan size
işlevini daha verimli hale getirmektir. Listeyi oluşturan iki türü özetlemeye karar verdim, ancak boyut fonksiyonunun imzasını oluşturamıyorum. Prelude itibaren"Ya a b" türüyle nasıl eşleşiyorsunuz?
instance (Finite a, Finite b) => Finite (Either a b) where
elems = combineLists [Left x | x <- elems] [Right x | x <-elems]
size ??? = (size a) + (size b)
, bunu Either a b = Left a | Right b
biliyoruz.
Çalıştırdığım ilk şey, Either
eşleşmesiydi, ancak tabi ki bu bir tür değil, bu yüzden çalışmıyor. Ardından, ((Left a) | (Right b))
'u denedim, ancak bu konuda da devam etmeyeceğim. Başka hiçbir şey, Either a b
türüyle eşleşiyor gibi görünüyor.
size (Left a)
elde edebilir, ama
b
bileşeni eksik beri, hata alırsınız:
tabii bağlamında mantıklı
Ambiguous type variable `b' in the constraint:
`Finite b' arising from a use of `size' at <interactive>:1:0-12
, ama gerçekten nasıl hiçbir ipucu var eşleşme Either a b
.
Herhangi bir fikri olan var mı?
size (Left x) = size x
size (Right x) = size x
belirsiz tip değişkeni ilgili hata ayrı bir konudur: tip Either a b
ait
Bir tür ve yapıcı arasındaki fark hakkında biraz karıştı görünüyor. "Ya a b" iki Kurucular, "Sağ" "Sol" ve türüdür. Kurucular kod girerken, türler imzalara girer. türde bir çok "veri Foo = FON Int String" olarak, tip ve kurucu aynı adı kullandığından, bu ortak bir karışıklık olduğu; İlk "Foo" tür, ikincisi yapıcıdır. –