2012-04-23 8 views
6

DataCinds aracılığıyla ghc 7.4.1'de ve türüne özel işlemleri yapmak için kullanmak istediğim belirli bir yazım tablosunu kullanarak geliştirdiğim bir veri türüm var.Tanıtılan türdeki yazım örnekleri nasıl oluşturulur?

data Type = TInt32 | TInt64 | TInt16 
class TypeTraits a where 
    ... 

Sonra şöyle terfi tiplerinin typeclass örneklerini oluşturmayı deneyin:

Kind mis-match 
The first argument of `TypeTraits' should have kind `*', 
but `TInt32' has kind `Type' 
In the instance declaration for `TypeTraits TInt32' 

belirterek bu sorunu gidermek için çalışıyor:

instance TypeTraits TInt32 where 
    ... 

Ben aşağıdaki tipte hataları olsun 'a' türü:

class TypeTraits (a :: Type) where 
    ... 

Kind mis-match 
Expected kind `ArgKind', but `a' has kind `Type' 
In the type `a -> String' 
In the class declaration for `TypeTraits' 
+0

Tam olarak '' 'alanına ne koyabilirsiniz? "TInt32", yerleşik bir tip değil, bu yüzden "a" değerini kendi başına kullanamaz. CrazyThing :: TypeTraits a => SomeTypeConstructor a' gibi bir şey tahmin ediyorum? Böyle bir şeyin nasıl faydalı olabileceğini hayal etmekte zorlanıyorum, gerçi gerçekten gergin olsam da, bir şekilde faydalı olduğunu düşünebilirim * bir şekilde *. Olabilir. –

+0

Fikir, her bir örnek için özelliklerin sahip olmasıydı. Bu yüzden değer aramıyorum, ama sadece tipeclass ve bunun için orada seçmek istediğim işlevi belirtmek için bir yer tutucu. örneğin: 'class TypeTraits (a :: Type) türünde bir tipOf :: Proxy a -> Int' – Chetan

cevap

7

Sorun, sınıfın bedeninde; Kaldırılmış türdeki türlerin hiçbir değeri yoktur, bu nedenle birini parametre olarak alan bir işleve sahip olamazsınız. Proxy a -> String veya benzeri kullanmanız gerekecek.

Bu arada, PolyKinds uzantısını açarsanız, tür açıklamalarını tamamen atlayabilmeniz gerekir. Ben Data.Proxy itibaren bir * -> * olabileceğini düşünüyorum çünkü sen Type -> * gerek oysa (Aslında, kendi Proxy tipini tanımlamak için, bunu yapmak gerekebilir. Üzerinde PolyKinds ile data Proxy p = Proxy tanımlarsanız, o zaman olduğu gibi çıkarılabilir edeceğiz AnyK -> *.)

+1

[Kağıt] içindeki proxy veri türü (http://research.microsoft.com/en-us/ insanlar/dimitris/fc-kind-poly.pdf) sonunda mantıklı, teşekkürler! – Chetan