You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何声明嵌套类型?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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.29 15:17:45