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
cevap
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:
Data.Map ve listelerini mi arıyorsunuz? (ör. [Int]
).
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. –
Bağlantılı harita paketini deneyin: http://hackage.haskell.org/package/dependent-map –
@NathanHowell: Bunu bir yanıt olarak gönderir misiniz? Ben kontrol edeceğim, ama istediğim gibi belgelere benziyor. –
Ö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
'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. –
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. –
, 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.
- 1. Haskell eşdeğeri?
- 2. Haskell eşdeğeri C'nin __LINE__
- 3. makeLenses (Haskell)
- 4. Erlang'ın Haskell'in eşdeğeriyle eşdeğeri
- 5. Haskell printf - String
- 6. Haskell
- 7. Haskell,
- 8. Haskell
- 9. Haskell
- 10. Haskell
- 11. Haskell
- 12. Haskell
- 13. Haskell
- 14. Haskell
- 15. Haskell
- 16. Haskell
- 17. Haskell
- 18. Haskell
- 19. Haskell
- 20. Haskell
- 21. NSMethodSignature & NSInvocation eşdeğeri eşdeğeri 2
- 22. Survfit eşdeğeri?
- 23. PyQt_PyObject eşdeğeri?
- 24. os.path eşdeğeri?
- 25. phpMyAdmin eşdeğeri?
- 26. PowerShell eşdeğeri?
- 27. makedepend eşdeğeri?
- 28. CultureInfo.GetCultureInfo eşdeğeri?
- 29. MonoTouch.Dialog eşdeğeri?
- 30. IsFinite() eşdeğeri
İndirgemenin nedeni neydi? –
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
Ya yazılan AST'yi başka bir şeye çeviren ya da çalıştıran her şeyde aynı sorunlar ortaya çıkacaktır. –