模拟评估者

时间:2016-09-17 02:55:11

标签: haskell functional-programming

我正在使用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出了什么问题,有人可以向我解释一下吗?

1 个答案:

答案 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