Haskell 带闭包的字典功能
Haskell dictionary functionality with a closure
如果我有两种数据类型 type VarName = String
和 type E = VarName -> Maybe Integer
,其中 E
代表某种环境。我不想使用地图,而是想以某种方式模拟带有闭包的地图。即环境将用类似的东西初始化
initE = \_v -> Nothing
我想要一个扩展这个初始环境的函数,比如
extendE :: VarName -> Integer -> E -> E
然后,如果我调用 extendE "x" 42 initE
来更新环境并包含现在限制为值 42 的 x
。我该如何着手实施 extendE 功能?
您的新环境将是新 key/value 对和旧环境的包装器。在环境中查找密钥是一个 two-step 过程:
- 如果给定键匹配包装键,return包装值。
- 否则,将旧环境应用于给定密钥。
我将把它作为练习来填写 body。
extendE :: VarName -> Integer -> E -> E
extendE newkey newvalue env = \key -> ...
在return值的body中,你可以比较key
和newkey
,它会告诉你是否要returnJust newvalue
或 env 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
吗?
(我还在其中一个参数的命名上对你开了个小把戏……希望你注意到了。)
如果我有两种数据类型 type VarName = String
和 type E = VarName -> Maybe Integer
,其中 E
代表某种环境。我不想使用地图,而是想以某种方式模拟带有闭包的地图。即环境将用类似的东西初始化
initE = \_v -> Nothing
我想要一个扩展这个初始环境的函数,比如
extendE :: VarName -> Integer -> E -> E
然后,如果我调用 extendE "x" 42 initE
来更新环境并包含现在限制为值 42 的 x
。我该如何着手实施 extendE 功能?
您的新环境将是新 key/value 对和旧环境的包装器。在环境中查找密钥是一个 two-step 过程:
- 如果给定键匹配包装键,return包装值。
- 否则,将旧环境应用于给定密钥。
我将把它作为练习来填写 body。
extendE :: VarName -> Integer -> E -> E
extendE newkey newvalue env = \key -> ...
在return值的body中,你可以比较key
和newkey
,它会告诉你是否要returnJust newvalue
或 env 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
吗?
(我还在其中一个参数的命名上对你开了个小把戏……希望你注意到了。)