当我尝试编译它时,它告诉我b不在范围内。虽然我已经为b包含了where子句。不要理会类型同义词。
buildBDD :: BExp -> [ Index ] -> BDD
buildBDD exp inds = snd ( buildBDD' exp 1 inds [])
where
buildBDD' :: BExp -> Id -> [ Index ] -> [ ( Index, Bool ) ]
-> ( Id, BDD )
buildBDD' exp ind [] env
= (b, [])
buildBDD' exp ind (i : is) env
= buildBDD' exp i is [(ind, True)]
where
b = if eval exp env then -1 else -2
答案 0 :(得分:1)
where
子句仅适用于单行定义,因此您的第二个where
子句仅适用于单个定义
buildBDD' exp ind (i : is) env
。您需要将其向上移动,以使其适用于先前的定义。
答案 1 :(得分:1)
您需要将where
范围添加到正确的模式匹配中!像if eval exp env
这样的东西甚至可能没有意义,如果你把它放到错误的模式定义,因为例如此时没有env
个变量匹配。
buildBDD' exp ind [] env = (b, [])
where b | eval exp env = -1
| otherwise = -2
buildBDD' exp ind (i : is) env
= buildBDD' exp i is [(ind, True)]