haskell - 在 Haskell 中编写数学表达式的惯用方式

标签 haskell operators symbolic-math

我想用 Haskell 写下数学表达式。 例如:

foo = (3 * 'x' + 2 * 'y' -- => 3x+2y

有没有一种方法可以从下面重写实现,使 AddMul 可以被运算符 + 替换>*分别是?

data Expr = Const Integer
          | Var Char
          | Add Expr Expr
          | Mul Expr Expr
          deriving (Show)
 ...
 foo =  Add (Mul (Const 3)  (Var 'x')) (Mul (Const 3) (Var 'y'))

丑得要命。 使用 TypeOperators 也行不通,它要求运算符前面有 :

infixl 4 :+:
infixl 5 :*:, :/:
infixr 6 :^:

data Expr = Const Integer
          | Var Char
          | Expr :+: Expr
          | Expr :*: Expr
          | Expr :^: Expr
          | Expr :/: Expr
          deriving (Eq, Show)

表达式的声明将变成:

foo = (Const 3 :*: Var 'x') :+: (Const 2 :*: Var 'y')

不那么丑了,但还是很糟糕。有什么想法吗?

最佳答案

{-# LANGUAGE OverloadedStrings #-}

import Data.String

data Expr = Const Integer
          | Var Char
          | Add Expr Expr
          | Mul Expr Expr
          deriving (Show)

instance Num Expr where
  (+) = Add
  (*) = Mul
  fromInteger = Const
  abs = undefined
  signum = undefined
  negate = undefined

instance IsString Expr where
  fromString s = Var (head s)

main = do
  let expr = 3 * "x" + 2 * "y" :: Expr
  print expr

关于haskell - 在 Haskell 中编写数学表达式的惯用方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27585061/

相关文章:

postgresql - count(*) 类型与 Database.PostgreSQL.Simple 的兼容性错误?

python - 如何对 python 说 (a+b) = (b+a) 和 (a*b) = (b*a)

scala - Scala- boolean 值-&vs &&,| vs ||

java - 三个运算符(operator)的麻烦

python - Sympy 求解无法找到简单方程的零空间

MATLAB 2016b : Determine unassigned symbolic functions of an expression

functional-programming - 符号计算和函数式编程有关系吗?

haskell - 小村庄模板中的 $forall 问题

haskell - 等式推理的名称从何而来?

haskell - 这个惰性评估示例背后的魔力是什么?