2014年10月6日月曜日

プログラミングHaskell P143 exprs関数について

P143 exprs関数の適用についても、少しくわしく考えてみた。
(途中の式表現は、正しい表現と言えないところもありかも...)

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 件のコメント:

コメントを投稿