【发布时间】:2011-09-25 10:38:15
【问题描述】:
又是 Haskellers 和 Haskellettes,
我仍然有问题,我真的不知道何时使用(Class a) => a、Type 或
Type a 其中 Type 是“联合类型”,例如 Val 和 ExprTree
现在我想通过添加一些实例使我的数据类型 ExprTree 更加通用:
import Ratio
data Fun = Add|Sub|Mul|Div|Pow
deriving (Eq,Ord)
instance Show Fun where
show Add = "+"
show Sub = "-"
show Mul = "*"
show Div = "/"
show Pow = "^"
type Label = Rational
type Var = String
class Eval e where
eval :: (Num a) => e -> a -> a
data ExprTree a = Leaf {lab::Label, val::Val a}
| Node {lab::Label, fun::Fun, lBranch::ExprTree a, rBranch::ExprTree a}
deriving(Eq,Ord)
data Val a = Num a | Var String deriving (Eq, Ord, Show)
instance (Num a) => Num (ExprTree a) where
...
fromInteger i = Leaf (0%1) i -- <--error
instance Show (ExprTree a) where
show (Leaf l a) = show a -- <-- error
show (Node l f lb rb) = (show lb)++" "++(show l)
++(show f)++" "++(show rb)++"\n"
instance Eval (Val a) where
eval (Var v) n = n
eval a _ = a -- <-- error
我认为这些问题都是同类问题。并且不理解类和类型之间的区别等等,这是我的haskell编程基础上的一个漏洞;所以我真的很想了解这一点,而不是解决任何作业。
注意:标签是有理数 - 这使得插入和搜索比使用自然数或整数标签更容易。
提前致谢!
【问题讨论】:
-
我认为
eval的类型不是您想要的。它太笼统了,因为它承诺适用于任何a,只要它在Num中。