. Ne yazık ki, çoğu aslında çalışmıyor. Heyhat!
instance Listable (\a -> (a, a)) where
asList (p, q) = [p,q]
Maalesef tip düzey lambda'lar almıyorlar:
Birincisi, fonksiyonel programcı olarak, ben bu gerçekten yazmak istiyorum olduğuna bahse girerim. tip eşanlamlı tam olarak uygulanan olmadığı için, ya izin verilmez
type Same2 f a = f a a
instance Listable (Same2 (,)) where { ... }
: Bir tür eşanlamlı kullanarak yukarıdaki lambda adlandırılmış versiyonunu yazabiliriz. tutarlı, tek bir tür için yok çünkü, bu da başarısız olsa app
ne olabileceğini düşünmeden
class Listable app f where
asList :: app f a -> [a]
instance Listable __ Maybe where { ... }
instance Listable __ (,) where { ... }
: Biz yerine türü değişkenleri nasıl uygulanacağını tarif edersiniz ekstra argüman alarak tipi sınıfını düşünebiliriz f
parametresi.
Aslında işe yarayan şeylere geçerken, en yaygın yol, eş anlamlılık yaklaşımını newtype
içine sarmak olduğunu düşünüyorum, daha sonra yalnızca içerdiği sarma ve paketlemeyle uğraşmaktır.
newtype Same2 f a = Same2 (f a a)
instance Listable (Same2 (,)) where { ... }
Biraz çirkin ise uygulanabilir. Ayrıca, bu tür yapıcı bileşimi ve diğer oyuncakları da tanımlayabilir, daha sonra çember atlama noktaları olan bir kiriş yığını altına gömülmüş tip-seviye nokta-içermeyen ifadelerle delirebilirsiniz. Son bir yaklaşım olarak
, ayrıca tam uygulanmış versiyonu
tek tip parametresi için den
gidiyor, "tersten" yukarıdaki lambda tarzı bir yaklaşım kodlayabilir: class Listable t where
type ListableElem t :: *
asList :: t -> [ListableElem t]
Olmak Böyle bir şey yapabilen tip aileler için ana motivasyonlardan biridir. Aynı şey MPTC ve fundeps ile ifade edilebilir, ancak 1) eşdeğer ve 2) çok daha çirkin, bu yüzden bunu yazmaya çalışmam.
Bunu denemek için tembel olmaktan dolayı özür dilerim, ama son yaklaşım "Listable (a, a)' ye izin vermez - değil mi? – yatima2975
@ yatima2975: En dıştaki tip kurucu olarak '(,)' ile farklı örneklere sahip olma pahasına, evet. Muhtemelen cevabımın bir örneği olarak şunu söylemeliydim, şimdi bahsettiğine göre ... –