(途中の式表現は、正しい表現と言えないところもありかも...)
exprs ::[Int]->[Expr]
exprs [] = []
exprs [n]=[Val n]
exprs ns = [e | (ls,rs) <-split ns, l <- exprs ls, r <- exprs rs, e <- combine l r ]
combine :: Expr -> Expr -> [Expr]
combine l r = [App o l r | o<- ops]
ops :: [Op]
ops =[Add,Sub,Mul,Div]
exprs [1,2,3]=[e| (ls,rs) <-split [1,2,3], l <- exprs ls, r <- exprs rs, e <- combine l r ]
(ls,rs) <-split [1,2,3]は、次の2とおり
([1],[2,3]) ([1,2],[3])
ひとつめで l <- exprs ls, r <- exprs rs, e <- combine l r を考えて
exprs ls=exprs [1]=[Val 1]
exprs rs=exprs [2,3]= [e | (ls,rs) <-split [2,3], l <- exprs ls, r <- exprs rs, e <- combine l r ]
= [e |([2,],[3]), l <- exprs [2], r <- exprs [3], e <- combine l r ]
= [e |([2,],[3]), [Val 2], [Val 3], e <- combine [Val 2] [Val3] ]
=[App Add (Val2) (Val3),App Sub …..4種類の演算]
[Val 1]と[App Add (Val2) (Val3),App Sub …..4種類の演算]についても4種類の演算がある
ふたつめも同様に可能
こんな感じで、すべての演算を表せそうだ。
0 件のコメント:
コメントを投稿