2011-11-29 22 views
10

Tam olarak güvenli bir AST için GADT'leri kullanarak Haskell'de tam yazılan bir DSEL oluşturmayla oynamaktayım ve doğru yazılmış bir derleyici yapmak, Haskell türünden haritalar gibi yapılar gerektirir. Hem türlere hem de değerlere (yazılan ortamlar) ve Haskell tipi sistem tarafından anlaşılabilir. C++, Boost.Fusion kütüphanesine bu gibi yapılara sahiptir (tip-> değer haritaları, yazılan değerlerin vektörleri, vb.). Data.Tuple dizileri ilgilenir, ancak Boost.Fusion map s gibi şeylerin Haskell sürümleri var mı?Haskell eşdeğeri Boost.Fusion

+0

İndirgemenin nedeni neydi? –

+0

Bir "derleyici" açıkladığınızda, hangi gösterimden derleme yapıyorsunuz? Eğer GADT'iniz varsa, gerçekten bunun için tercüman mı yazıyorsunuz, yoksa GADT'den bir fonksiyona mı, örneğin C koduna mı? – sclv

+0

Ya yazılan AST'yi başka bir şeye çeviren ya da çalıştıran her şeyde aynı sorunlar ortaya çıkacaktır. –

cevap

10

dependent-map paketine bakın. Onu ben kullanmadım ama istediğin şeyi yapıyor gibi görünüyor. Eğer gerçekten tip (ve sadece yazın) eşitliği kullanmanız gerekiyorsa, o zaman bir varsayılan değer üzerinde anlaşmanız veya anahtar olarak bir TypeRep kullanmanız gerekebilir.

import Data.Typeable 
import Data.Map 

type TypeMap a = Map TypeRep a 

insertT :: Typeable k => k -> a -> Map k a -> Map k a 
insertT v = insert (typeOf k) 

lookupT :: Typeable k => k -> a -> Map k a -> Map k a 
lookupT v = lookup (typeOf k) 

Şimdi insertT (undefined :: Int) 5 gibi kod kullanabilirsiniz:

1

Data.Map ve listelerini mi arıyorsunuz? (ör. [Int]).

+0

Hayır, elemanların farklı türlere sahip olması gerektiğinden, burada anahtarlar türlerdir. "(Int -> 5, Float ->" foo ")' gibi bir eşlemenin bir değerde olmasını (global bir haritalama sağlayan bir tip sınıfı değil) istiyorum. El ile nasıl yazacağımı biliyorum (sanırım), ama birileri bunu zaten yapıp yapmadığını merak ediyordum. –

+1

Bağlantılı harita paketini deneyin: http://hackage.haskell.org/package/dependent-map –

+0

@NathanHowell: Bunu bir yanıt olarak gönderir misiniz? Ben kontrol edeceğim, ama istediğim gibi belgelere benziyor. –

4

Öncelikle tüm çok açık cevap kolayca Typeable (baz kütüphanesinin parçası) kullanan bir "tip> değer haritası" yazabilmesidir öğeleri türe göre eklemek için.

Fakat Fusion'a baktığımızda, bu, sizin için daha sonra olabileceğiniz gibi görünmüyor. Rasgele veri yapıları üzerinde çalışan kod oluşturmanıza izin veriyor gibi görünüyor? Bu Haskell'de "Boilerplate'inizi" jenerik programlaması olarak bilinen bir şey. Ayrıntılar için papers veya hackage'a bakın, ancak isteğe bağlı veri yapılarını işleyen ve verilen türlerin değerlerini seçen kod yazmanıza izin verir.

Fusion'ı gördüğüm birkaç şey muhtemelen HList veya muhtemelen fclabels gibi kütüphaneler kullanılarak taklit edilebilir. Ama gerçekten ihtiyacınız olan şeylere bakmadan daha fazla söylemek zor olan gerçekten. Daha önce belirtildiği gibi

+0

'TypeMap' işleviniz çalışır ancak derleyiciyi sağdaki türün soldaki (veya 'Data.Dynamic')' TypeRep 'ile eşleştiğine ikna etmek için 'güvensizControl' gerektirir. HList de ilginç görünüyor; fclabels, fermuarlar sağladığı gibi görünüyor.Rasgele veri türleri üzerinde yansıma/veri-genel programlamaya ihtiyacım yok, bu yüzden SYB'nin yardımcı olacağını düşünmüyorum. –

+0

Peki, söz konusu değerin dizin türüne sahip olmasını isteyip istemediğinizden emin değildim. Eğer bunu istiyorsanız, muhtemelen 'HList' (eğer haritanızın anahtarlarını biliyorsunuz) ya da 'unsafeCoerce 'etrafında dolaşmak için değerlerde' Dynamic 'kullanarak benzer bir harita yapımını kullanmalısınız. –

3

, dependent-map şeylerin haritası tarafı için doğru bir seçim gibi görünüyor, ama ben elle dizilerini hokkabazlık alternatif olarak hlist ait HArray arayüzüne bakarak tavsiye ederim.