Làm cách nào để đơn giản hóa biểu thức số học cơ bản?Làm cách nào để đơn giản hóa một biểu thức số học cơ bản?
ví dụ:
module ExprOps where
simplify :: Expr -> Expr
simplify (Plus(Var"x") (Const 0)) = Var "x"
Tôi phải làm gì?
module Expr where
-- Variables are named by strings, assumed to be identifiers.
type Variable = String
-- Representation of expressions.
data Expr = Const Integer
| Var Variable
| Plus Expr Expr
| Minus Expr Expr
| Mult Expr Expr
deriving (Eq, Show)
Các đơn giản hóa tôi có trong tâm trí là:
0*e = e*0 = 0
1*e = e*1 = 0+e = e+0 = e-0 = e
và đơn giản hóa subexpressions liên tục, ví dụ Plus (Const 1) (Const 2) sẽ trở thành Const 3. Tôi sẽ không mong đợi biến (hoặc các biến và hằng số) được nối: Var "st" là một biến riêng biệt từ Var "s".
Những gì tôi muốn đạt được là tạo ra một mô-đun như trên có sử dụng một chức năng gọi là simplify :: Expr->Expr
rationals
Ví dụ được cung cấp bởi @ user41000 chỉ có hai con. Tôi phải suy nghĩ gì khi mở rộng nó đến nhiều hơn sau đó 2 thuật ngữ ví dụ: đơn giản hóa (Plus (Plus (Const 2) (Const 1)) (Const 3)) = Const 6. Làm thế nào để đệ quy làm việc ở đây? – plopd
Bạn có thể chỉnh sửa mọi thứ một cách tích cực hơn những gì tôi viết trên đỉnh đầu của tôi ở trên: 'simplify (Plus ab) = case (đơn giản hóa, đơn giản hóa b) của (Const ca, Const cb) -> Const (ca + cb) ' vv Cách khác, bạn có thể sử dụng bộ kết hợp ống kính 'viết lại' để làm điều tương tự với điểm cố định. –