Bu, Dynamic
uygulamasının open-typerep kitaplığında uygulanmasıyla yapılabilir (genel programlama ve birçok GHC uzantısı kullanarak kabul ediyorsanız).
{-# LANGUAGE TypeOperators #-}
import Data.TypeRep
type Types = BoolType :+: IntType :+: ListType
x, y :: Dynamic Types
x = toDyn [False,True]
y = toDyn [1, 2 :: Int]
test1 = show x
test2 = show y
show
tanımı basittir ve dinamik değerler üzerinde diğer işlevleri tanımlamak için kütüphane kullanabilirsiniz.
Yukarıdaki örnekte kapalı tipte bir evren Type
kullanılır. Ancak Veri Tipleri à la Carte püf noktalarını kullanarak açık evrenler için işlevleri de tanımlayabilirsiniz. Örneğin, show
'un kendisi açıktır.
Performans
bir simple benchmark bu Dynamic
Yukarıda kullanılan küçük tip evrenin base
içinde Data.Dynamic
göre 2-3 kat daha yavaş olduğunu göstermektedir. Evreni 30 tip kurucuya yükseltmek onu 10 kat daha yavaş hale getiriyor. Yeni tipler
open-typerep
için
Oto türetilmesi önceden tanımlanmış temsil türlerinin az sayıda evrenlere yapmayı destekliyorsa. Prensipte TemplateHaskell'i yeni türler için otomatik olarak türetmek için kullanmak mümkün olmalıdır, ancak diğer örneklerin ne olduğuna bağlı olarak Witness
ve PWitness
için doğru örnekleri oluşturmak zor olacaktır. (Witness
, Dynamic
için Show
örneğinde kullanılır.)
Kısaca, hayır. Bu bilginin erişilebilir olmasını isterdim, ancak sınıf bilgisi kayboldu ve derleme sonrasında yalnızca bir typerep kalıyor. –
Ancak, mutlaka, her bir fontu sınıf sözlükleriyle ilişkilendiren bir yerde bellekte büyük bir tablo olabilir. –
... ama yok. –