我正在使用Haskell模拟评估者。它应该很简单,但我无法调试。
在这里,我将State
定义为查找函数(String -> Int
),初始状态(empty
,异常变量评估0
)和{{1} }将新密钥(及其值)添加到extend
环境:
base
当我测试程序时:
type State = String -> Int
extend :: State -> String -> Int -> State
extend base key val = \x -> if key == x
then val
else base key
empty :: State
empty = \x -> 0
我认为aState = extend empty "A" 5
bState = extend aState "B" 4
cState = extend bState "C" 3
应该等同于一个函数:
cState
但相反,我得到\x -> if x == "C"
then 3
else if x == "B"
then 4
else if x == "A"
then 5
else 0
和cState "B" == 0
。
我无法看到cState "A" == 0
出了什么问题,有人可以向我解释一下吗?
答案 0 :(得分:6)
在else
语句中,您在每次递归中搜索key
(而不是x
):else base key
。修复它:
extend :: State -> String -> Int -> State
extend base key val = \x -> if key == x
then val
else base x
顺便说一下,你可以写:
empty :: State
empty = \_ -> 0
因为empty
无论输入如何都会返回0
。