2011-08-25 19 views
8

Bir liste olan ancak bazı yapıları olan bir "Ideal" türü tanımlamak istiyorum. Sayısal prelüd, listeler için Ring örneklerini zaten tanımlar, ancak istediğim toplama ve çarpma tanımlarını kullanmıyorlar. Bu yüzden bu iyi çalışırHaskell newtype, ancak eski işlevleri koru

newtype Ideal a = Ideal [a] 

demeliyim bu durumda düşünüyorum, ama, yapmaya çalışacağım take 5 $ Ideal [0..] diyorsan şimdi bana bir hata verir.

İstediğim işlevleri tutabildiğim ve yalnızca açıkça geçersiz kıldığım tanımları geçersiz kılmamın bir yolu var mı?

cevap

6

Düz işlevler için, no. Kendi tanımlarınızı belirtmeniz gerekecek.

Ancak, tür sınıfına ait olan işlevler için, newtype temel türünden istediğiniz tür sınıflarını göstermek için GeneralizedNewtypeDeriving uzantısını kullanabilirsiniz.

{-# LANGUAGE GeneralizedNewtypeDeriving #-} 
newtype MyState a = MyState (State Int a) 
    deriving (Monad) 
11

çok şeyler mesela tamamen otomatik, sen the newtype package yılında fayda fonksiyonlarını kullanabilir olmaya ayarlanmış değilseniz over Ideal $ take 5 gibi bir şey.

Düzenleme: Ayrıca, bir kenara baktığınızda, diğer durumları işlemek için newtype paketinden işlevleri genişletmek çok zor değildir. Örneğin, ben bu tanımlar ortalıkta yoktu: Değil aslında böyle, bağdaştırıcılarla en iyi tasarım

infixl 3 ./ 
(./) :: (Newtype n o) => (o -> t) -> (n -> t) 
(./) fx = fx . unpack 

liftN f x = pack $ f ./ x 
liftN2 f x y = pack $ f ./ x ./ y 
liftN3 f x y z = pack $ f ./ x ./ y ./ z 

, sanıyorum, ancak fikir.