gpt4 book ai didi

haskell - 如何使用具有不同键类型的 IntMap?

转载 作者:行者123 更新时间:2023-12-04 16:48:55 24 4
gpt4 key购买 nike

我在使用两个 IntMap 的文档中有一条记录:

data Doc = Doc { kernels :: IntMap Kernel, nodes :: IntMap Node }

但是我发现两个 IntMap 中的键具有不同的含义,并且我无法将两种不同的类型分开,并且在混合内核类型和节点类型时不会出错。我想要检查内核映射和节点映射中的键并且不允许混淆的功能。例如:
someFunction :: Doc -> KernelKey -> NodeKey -> a
someFunction doc k1 k2 = .....

而不是当前:
someFunction :: Doc -> Int -> Int -> a
someFunction doc k1 k2 = .... -- warning check twice k1 and k2

有可能吗?或者我将从 IntMap 更改至 Map .

谢谢

最佳答案

您可以使用 newtypeInt 周围制作 wrapper 来区分它们的含义。

newtype KernelKey = KernelKey Int
newtype NodeKey = NodeKey Int

someFunction :: Doc -> KernelKey -> NodeKey -> a
someFunction doc (KernelKey k1) (NodeKey k2) = ...

这样,您仍然可以使用 IntMap在内部,但公开一个更安全的接口(interface),特别是如果您还控制 KernelKeyNodeKey值被创建,即您不导出它们的构造函数,因此用户只能将它们作为其他函数的返回值获取。

请注意 newtype包装器在运行时消失,因此这种额外的包装和展开不会以任何方式影响性能。

关于haskell - 如何使用具有不同键类型的 IntMap?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6901930/

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