Haskell 带闭包的字典功能

Haskell dictionary functionality with a closure

如果我有两种数据类型 type VarName = Stringtype E = VarName -> Maybe Integer,其中 E 代表某种环境。我不想使用地图,而是想以某种方式模拟带有闭包的地图。即环境将用类似的东西初始化 initE = \_v -> Nothing 我想要一个扩展这个初始环境的函数,比如

extendE :: VarName -> Integer -> E -> E

然后,如果我调用 extendE "x" 42 initE 来更新环境并包含现在限制为值 42 的 x。我该如何着手实施 extendE 功能?

您的新环境将是新 key/value 对和旧环境的包装器。在环境中查找密钥是一个 two-step 过程:

  1. 如果给定键匹配包装键,return包装值。
  2. 否则,将旧环境应用于给定密钥。

我将把它作为练习来填写 body。

extendE :: VarName -> Integer -> E -> E
extendE newkey newvalue env = \key -> ...

在return值的body中,你可以比较keynewkey,它会告诉你是否要returnJust newvalueenv key.

所以你想要

type VarName = String
type E = VarName -> Maybe Integer

initE v = Nothing

extendE :: VarName -> Integer -> E -> E
extendE "x" 42 initE "x" = Just 42    -- same "x"
extendE "x" 42 initE  v  = Nothing    -- something else

它照原样工作,

GHCi> extendE "x" 42 initE "x" 
Just 42
GHCi> extendE "x" 42 initE "v" 
Nothing 
GHCi>

当然,您可能希望将其概括为一点位,

extendE name theAnswer initE v 
             | v == name = Just ....
             | otherwise = ....

在我们填空之后,它也能正常工作。事实上,这就是你想要的定义。

我留下了一个关键点让你完成那里,即如何在这种情况下概括 Nothing利用 可用的相关位给我们(也就是说,函数参数)。我们可以通过将什么应用到什么来产生 Nothing 吗?

(我还在其中一个参数的命名上对你开了个小把戏……希望你注意到了。)