gpt4 book ai didi

haskell - 如何编写 Control.Lens.AT 的实例

转载 作者:行者123 更新时间:2023-12-01 22:25:46 25 4
gpt4 key购买 nike

我有一个数据结构,可以理解为类似于 Data.Map ,因为它将一种类型的键映射到另一种类型的值。我想为这种类型编写一个 Control.Lens.At 实例,但我似乎永远无法满足所有要求。

给定带有查找插入更新删除Struct k v ,我必须做什么才能使 instance At (Struct k v) 工作?

最佳答案

at方法应该返回给定索引的索引透镜作为结构的输入,其行为如下:

  • 获取时,如果 key 不存在,则返回Nothing ,否则返回结构中键处的值。
  • 设置时,如果新值为 Nothing ,从结构中删除该键,否则将其设置(如果尚不存在则创建它)为 Just 中的值.
  • 索引只是给 at 的键。

这会生成满足您要求的以下代码:

instance At (Struct k v) where
at key = ilens getter setter
where getter = (key, lookup key)
setter s Nothing = delete key s
setter s (Just newValue) = insert key newValue s

我使用 lens构建镜头 ilens从 getter 和 setter 构建索引透镜。我还假设您的函数具有以下类型:

lookup :: k -> Struct k v -> Maybe v
delete :: k -> Struct k v -> Struct k v
insert :: k -> v -> Struct k v -> Struct k v
-- Insert should override the key when it's already there

您仍然需要定义 IxValueIndex类型族实例:

type instance IxValue (Struct k v) = v -- A (Struct k v) contains values of type v
type instance Index (Struct k v) = k -- A (Struct k v) has keys of type k.

编辑:实际上,at 必须返回一个索引镜头,而不仅仅是一个镜头。我还混淆了 setter 参数的顺序。

关于haskell - 如何编写 Control.Lens.AT 的实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18494462/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com