我想用 Haskell 写下数学表达式。 例如:
foo = (3 * 'x' + 2 * 'y' -- => 3x+2y
有没有一种方法可以从下面重写实现,使 Add
和 Mul
可以被运算符 +
和 替换>*
分别是?
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/