bir Enum türü ile ilişkili Ints listesini oluşturun:Ben enumerable olduğundan hem de sınırlanmış bir türdeki tüm değerlerini sıralar bir yardımcı fonksiyonu var
enumerate :: (Enum a, Bounded a) => [a]
enumerate = [minBound .. maxBound]
ve tamsayılar için haritalama enumerable türlerini içeren bir veri türü : vals
tüm olası enumerable değerleri temsil tamsayılar listesidir
data Attribute a = Attribute { test :: a -> Int
, vals :: [Int]
, name :: String }
. Örneğin, eğer
data Foo = Zero | One | Two deriving (Enum,Bounded)
sonra
vals
[0,1,2]
olacağını vardı.
Ben sadece bir enumerable tip bir a
eşleştiren bir fonksiyon ve bir isim verilmiş, programlama yoluyla bu özellikleri oluşturmak isterler. Böyle bir şey: tip imzasında b
ile enumerate
çağrısını bağlamanın bir yolu yoktur çünkü
attribute :: (Enum b, Bounded b) => (a -> b) -> String -> Attribute a
attribute f str = Attribute (fromEnum . f) vs str
where
vs = map fromEnum enumerate
Bu, typecheck etmez.
vs = map fromEnum $ enumerate :: [b]
ama bu derleme ya gelmez - derleyici o b
b1
yeniden adlandırır: Ben bunu yapabileceğimi düşündüm.
attribute :: (Enum b, Bounded b, b ~ c) => {- ... -}
vs = map fromEnum $ enumerate :: (Enum c,Bounded c) => [c]
ama yine c
c1
yeniden adlandırılır: Ben GADTs uzantısını kullanarak, akıllı olmaya çalıştım.
ben Attribute
türü (I b
potansiyel farklı değerlere sahip nitelikler listelerini depolamak istediğiniz başlıca nedeni parametre olarak b
türünü içerecek şekilde istemiyorum - test
a -> Int
tip vardır ve vals
[Int]
tip vardır bu yüzden). ben bunu yapmak ne istiyor, böylece
nasıl bu kodu yazabilirim?
Dürbünlü Tipi Değişkenler perfecly çalışıyor, teşekkürler! –
Ayrıca, bu undefined''i ilk kez kullanmışken faydalı bir iş yapmak için kullanılır. –
@ChrisTaylor: Tabi ki 'const' gibi farklı bir uzmanlık kullanabilirsin, örneğin: asTypeOf2 :: [b] -> (a -> b) -> [b] 've sonra da 'numaralandır' \\ asTypeOf2 yazabilirsiniz \ 'f', ama muhtemelen çabaya değmez. – Vitus