Şu anda bir ifade ayrıştırıcısı yazıyorum. Sözlüksel ve sözdizimsel analizleri yaptım ve şimdi türleri kontrol ediyorum. Bu (basitleştirilmiş sürümü) gibi bir veri structire ifadeyi vardır:Yeni bir tür tanıtacak bir Haskell işlevi nasıl oluşturulur?
data Expr = EBinaryOp String Expr Expr
| EInt Int
| EFloat Float
Ve şimdi yeni bir türle dönüştürmek verecek bir işlev gerekir, ayrıca tip bilgiler içerecektir hangi TypedExpr
söylüyorlar. Ve şimdi asıl problemim, bu tip nasıl görünmelidir. İki fikirleri var - tipi parametresi ile:
data TypedExpr t = TEBinaryOp (TBinaryOp a b t) (TExpr a) (TExpr b)
| TEConstant t
addTypes :: (ExprType t) => Expr -> TypedExpr t
veya olmadan:
data TypedExpr = TEBinaryOp Type BinaryOp TypedExpr TypedExpr
| TEConstant Type Dynamic
addTypes :: Expr -> TypedExpr
Ben ilk seçeneği ile başladı
, ancak bu yaklaşım ifadenin türünü bildiğiniz varsayılmaktadır çünkü sorunlarla karşılaştı ayrıştırmadan önce (benim için çoğu durumda doğrudur, ama her zaman değil). Bununla birlikte, bunu sevdim, çünkü Haskell'in tip sistemini kullanmam ve derleme zamanında çoğu hatayı kontrol etmeme izin veriyor.
ilk seçeneği ile bunu yapmak mümkün mü?
Hangisini seçersiniz? Niye ya?
Her seçenekte hangi sorunları beklemeliyim? çalışma zamanında ayrıştırılmasını yapıyoruz yana
Vay canına! ilginç fikir. Bunu asla düşünmüyorum :) – mik01aj
Sanırım çözümünüzü çok iyi anlayamıyorum - "eInt", "eBinaryOp" ne yapmalı? Expr'imi bu modele nereye koyacağım? – mik01aj