Skip to content

Instantly share code, notes, and snippets.

@adragomir
Created March 18, 2016 18:51
Show Gist options
  • Save adragomir/3859eef82e437ebd755c to your computer and use it in GitHub Desktop.
Save adragomir/3859eef82e437ebd755c to your computer and use it in GitHub Desktop.
diff :: Expr -> Expr
diff e =
case e of
(Lit _) -> Lit 0
(Const _) -> Lit 0
(Exp Var) -> Exp Var
(Exp x) -> diff $ Apply (Exp Var) x
(Ln Var) -> Inv Var
(Ln x) -> diff $ Apply (Ln Var) x
(Cos Var) -> Neg $ Sin Var
(Cos x) -> diff $ Apply (Cos Var) x
(Sin Var) -> Cos Var
(Sin x) -> diff $ Apply (Sin Var) x
(Tan Var) -> Inv (Pow (Cos Var) (Lit 2))
(Tan x) -> diff $ Apply (Tan Var) x
(Const _) -> Lit 0
(Var) -> Lit 1
(Add f g) -> let f' = diff f
g' = diff g
in Add (Apply f' Var) (Apply g' Var)
(Mul f g) -> let f' = diff f
g' = diff g
in Add (Mul (Apply f' Var) (Apply g Var))
(Mul (Apply f Var) (Apply g' Var))
(Neg f) -> Neg $ diff f
(Inv f) -> let f' = diff f
in Mul f' (Inv (Pow f (Lit 2)))
(Pow f g) -> diff $ Exp (Mul (Ln (Apply f Var))
(Apply g Var))
(Sub l r) -> diff $ Add l (Neg r)
(Div l r) -> diff $ Mul l (Inv r)
(Sqrt x) -> diff $ Pow x (Inv (Lit 2))
(Apply f g) -> let f' = diff f
g' = diff g
in case g' of
Var -> f'
_ -> Mul (Apply f' (Apply g Var))
(Apply g' Var)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment