代码:
data Exp a = Const a | Eq (Exp a) (Exp a)我希望Const包含一个类型为show的值,以便以后可以打印它。因此,在C#中,我会写:
class Const : Exp { IShow X; }
class Eq : Exp { Exp X, Y; }我怎么才能在哈斯克尔做到这一点?
发布于 2009-12-07 01:40:21
{-# LANGUAGE GADTs #-}
data Exp a where
Const :: Show a => a -> Exp a
Eq :: Exp a -> Exp a -> Exp a如果您想在Eq的不同分支中允许不同的数据类型,那也可以。
data Exp where
Const :: Show a => a -> Exp
Eq :: Exp -> Exp -> Exp发布于 2009-12-07 01:00:55
你可以说
data (Show a) => Exp a = Const a | Eq (Exp a) (Exp a)但是,这几乎总是一个坏主意,因为它强制每个使用Exp的函数都提到show约束,即使它从来不使用Show方法。相反,将show约束放在与其相关的函数上。有关解释,请参见真实世界Haskell。
发布于 2009-12-07 22:20:01
如果您只想知道Const的参数是可以show的,为什么不直接将结果的String值存储在构造函数中呢?例如:
data Exp = Const String | Eq Exp Expr
example = Eq (Const (show 0)) (Const (show ""))这与您的C#版本非常相似。
https://stackoverflow.com/questions/1857131
复制相似问题