如何声明嵌套类型?Haskell中基于BoolExpr定义VarAssociative类型的正确方法
解决VarAssociative类型定义的问题
哦,我明白你的问题了——你把BoolExpr里的Var构造函数当成了一个独立类型来用,但其实它只是用来构建BoolExpr值的构造器,本身不是类型。咱们来一步步解决这个问题:
方案1:直接使用Char类型(最简便)
你的BoolExpr里的Var构造函数接受的是Char类型的参数(比如Var 'a'表示变量a),所以VarAssociative需要存储的是变量名(Char)和对应的布尔值。直接把unVar的类型设为Char即可:
data BoolExpr = Var Char | Const Bool | Not BoolExpr | And BoolExpr BoolExpr | Or BoolExpr BoolExpr | Impl BoolExpr BoolExpr | Eq BoolExpr BoolExpr | Xor BoolExpr BoolExpr deriving (Eq) -- 正确的VarAssociative定义 data VarAssociative = VarAssociative { unVar :: Char, unValue :: Bool } deriving (Eq, Show)
这样你就可以创建变量关联,比如VarAssociative 'a' True,用来表示变量'a'的值为True。
方案2:单独定义Var类型(更清晰的语义)
如果你确实想单独定义一个Var类型来表示变量名(让语义更明确),那需要先创建这个新类型,再调整BoolExpr的构造函数避免命名冲突:
-- 先定义Var类型,用来表示变量名 newtype Var = Var Char deriving (Eq, Show) -- 修改BoolExpr,用新的Var类型作为构造器参数(这里把构造器改名为VarExpr避免和Var类型重名) data BoolExpr = VarExpr Var | Const Bool | Not BoolExpr | And BoolExpr BoolExpr | Or BoolExpr BoolExpr | Impl BoolExpr BoolExpr | Eq BoolExpr BoolExpr | Xor BoolExpr BoolExpr deriving (Eq) -- 现在可以用Var类型来定义VarAssociative了 data VarAssociative = VarAssociative { unVar :: Var, unValue :: Bool } deriving (Eq, Show)
这样你可以创建Var 'a'作为变量名,再用VarAssociative (Var 'a') True来关联值,语义上更清晰。
内容的提问来源于stack exchange,提问作者MaxLevs
相关产品推荐
相关产品推荐

