我有一個學校項目,我需要簡化用戶生成的數學表達式。我們還需要定義我們自己的基本操作符(:+:
是加法,:*:
是乘法等)。實現自定義運算符
例如:
Prelude> Const 9 :+: Const 3 :+: Const 2
Const 14
Prelude> Const 14 :*: Var 'x' :+: Const 10 :*: Var 'x'
Const 24 :*: Var 'x'
這是我到目前爲止有:
infixl 4 :+:
infixl 5 :*:, :/:
infixr 6 :^:
data Expr a = Var Char
| Const a
| (Expr a) :+: (Expr a)
| (Expr a) :*: (Expr a)
| (Expr a) :^: (Expr a)
| (Expr a) :/: (Expr a)
deriving (Show, Eq)
我已經試過這樣的事情對我的加法操作沒有成功:
class (Num a) => Expr a where
(:+:) :: a -> a -> a
instance Expr a where
x :+: y = x + y
所有我正在尋找的是一些關於如何開始這項工作的指導。我很喜歡創建自己的功能,並使用常用功能(map
,zip
,foldr
等)。我們最近開始學習類型類,函子,以及關於單子的簡介。
'x:+:y'中的'x'和'y'是'Expr a''。你將不得不實際執行整個簡化的事情,例如'Const a:+:Const b = Const(a + b)' – Ryan
您可能想從一個函數'evaluate :: Fractional a => Expr a - > a'開始。 (你將需要'Fractional'來劃分,其他的都在'Num'中。) – 2015-11-07 21:03:59
你可能必須使用模式匹配'simp(x:*:(y:/:x'))來實現簡化。 x == x'= y;簡化...「完全」簡化這個表達式是相當不重要的,所以我不知道你期望執行哪些簡化。 – user2407038