Yasadışı tip eşanlamlı aile uygulaması Haskell'de yerleşik dillerle çalışıyorum. Dillerim kaynak kodu olarak yazdırılabilir, bu yüzden bir Compile
sınıfı oluşturdum ve yazdırılabilen her program öğesi için bir sınıf örneği oluşturdum. Bu şekilde kodumu kompozisyonel olarak atabilirim. Bu modlar kavramları dikkate alınmadan önce iyi çalıştı.Haskell: Örneğin
Her dil iki modda kullanılabilir (Mode
sınıfının örnekleri olarak uygulanır). Basit modda her şey normaldir. Adlandırılmış modda bir çok program elemanı dizelerle değiştirilebilir. (Makro tanımları gibi çalışır.)
Tüm gösterimleri güvenli tipte tutmak istiyorum. Yani farklı langauges veya farklı modların program elemanları karıştırılamaz.
Yani sorun şudur: mod ne olursa olsun dilleri nasıl döküm?
{-# LANGUAGE TypeFamilies, MultiParamTypeClasses, FlexibleInstances #-}
class Compile a where
comp :: a -> String
-- common elements in all languages
data ElemA l m = ElemA (ElemB l m)
data ElemB l m = ElemB
class Lang l where
-- language-specific elements
data Instructions l :: * -> *
-- common modes for all languages
class Mode l m where
type MElemA l m :: *
type MElemB l m :: *
-- mode with normal program elements
data SimpleMode
instance Mode l SimpleMode where
type MElemA l SimpleMode = ElemA l SimpleMode
type MElemB l SimpleMode = ElemB l SimpleMode
-- a mode where each program element can be replaced with a string
data NamedMode
instance Mode l NamedMode where
type MElemA l NamedMode = Either String (ElemA l NamedMode)
type MElemB l NamedMode = Either String (ElemB l NamedMode)
-- definition of Lang1 language
data Lang1
instance Lang Lang1 where
data Instructions Lang1 m
= Add (MElemA Lang1 m) (MElemA Lang1 m) (MElemA Lang1 m)
| Mul (MElemA Lang1 m) (MElemA Lang1 m) (MElemA Lang1 m)
-- | ...
-- dumping the source code of Lang1 langauge
-- ILLEGAL TYPE SYNONYM FAMILY APPLICATION HERE
instance Compile (MElemA Lang1 m) where
comp _ = "A"
-- AND HERE
instance Compile (MElemB Lang1 m) where
comp _ = "B"
Bu tür eşanlamlı ailelerin sınıflarla iyi çalışmadığını biliyorum, bu yüzden başka bir çözüm arıyorum. Bildiğim (ama kullanmak istemiyorum)
Olası çözümler:
- Kullanım birden fonksiyonları yerine tek polimorfik
comp
fonksiyonu. - Sadece
NamedMode
temsil
teşekkürler: http://stackoverflow.com/questions/2590495/problem-when-mixing-type-classes-and-type-families?rq=1 –
Olabilir veri yerine yeni tip kullandınız - hayır? – lynnard