Haskell 模拟评估者

Haskell 模拟评估者,haskell,functional-programming,Haskell,Functional Programming,我在用Haskell模拟一个评估员。它应该很简单,但我无法调试 这里我将State定义为一个查找函数(String->Int),一个初始状态(empty,异常变量求值0),以及extend向基本环境添加新键(及其值): type State = String -> Int extend :: State -> String -> Int -> State extend base key val = \x -> if key == x

我在用Haskell模拟一个评估员。它应该很简单,但我无法调试

这里我将
State
定义为一个查找函数(
String->Int
),一个初始状态(
empty
,异常变量求值
0
),以及
extend
基本
环境添加新键(及其值):

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


我看不出
extend
有什么问题,有人能给我解释一下吗?

在您的
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
,而不考虑输入