2014-04-05 36 views
8

Dynamic türünde bir değişken verildiğinde, tam tür üzerinde koşullandırma yapmadan iç değişken tür sınıfından yararlanmak mümkün müdür? Örneğin, prettyShow işlevini yazmak istediğimi varsayalım. İç tip Show örneğiyse, o örneği kullanmalıyız; aksi halde, Dynamic sınıfının örneğini kullanmalıyız.Veri birleştirmek ve sınıfları yazmak

prettyShow :: Dynamic -> String 
prettyShow x = case fromDynamic x :: (forall a. Show a => Maybe a) of 
    Nothing -> show x 
    Just y -> show y 

Düzenleme: kodunda, aşağıdaki gibi görünebilir bu yapılabilir bazı iyi çözüm nelerdir, doğrudan yapılamaz görünür beri?

+0

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. –

+1

Ancak, mutlaka, her bir fontu sınıf sözlükleriyle ilişkilendiren bir yerde bellekte büyük bir tablo olabilir. –

+2

... ama yok. –

cevap

6

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.)

+0

Bu ve Data.Dynamic arasındaki performans farkı nedir? "Tipeable" sınıfınız, üzerinde kontrol sahibi olmayan türler için otomatik olarak türetilebilir mi? –

İlgili konular