基本的な算術演算を使用して式を単純化するにはどうすればよいですか?
3 に答える
意味がわかりませんが、式のデータ型がある場合は、再帰的な評価関数を定義できます。この場合、eval は単純化を意味します。
例えば、
data Exp = Lit Int
| Plus Exp Exp
| Times Exp Exp
eval :: Exp -> Int
eval (Lit x) = x
eval (Plus x y) = eval x + eval y
eval (Times x y) = eval x * eval y
言語に変数を追加すると、非常に興味深いものになりますが、これは式評価器の最も基本的な形式です。
ここで説明されている手法を使用できます: http://augustss.blogspot.com/2007/04/overloading-haskell-numbers-part-2.html。型を必要な型クラス (Num、Fractional、Floating) にして、-、+、* などが型で機能するようにします。式ツリーが最終的に構築されたら、それを操作して単純化できるものを確認できます。
モジュールExpr
-- 変数は文字列で名前が付けられ、識別子と見なされます。タイプ変数 = 文字列
-- 表現の表現。データ Expr = Const 整数 | Var 変数 | プラス Expr Expr | マイナスExpr Expr | Mult Expr Expr の導出 (Eq、Show)
0*e=e*0=0 や 1*e=e*1=0+e=e+0=e-0=e などの単純化と定数部分式の単純化、たとえば Plus (Const 1) (Const 2) は、 Const 3 になります。変数 (または変数と定数) が連結されるとは思いません。Var "st" は、Var "s" とは異なる変数です。
次の単純化のように記述する必要があります (Plus (Var'x') (Const 0)) = Var"x"