我正在尝试构建异构索引结构并提出以下解决方案,但有人告诉我不要使用存在类型。
你能看到更好的解决方案吗?
我想保持接口定义(type
and class
)和具体实现(data
and instance
)之间的分离。按照@hammar 的评论进行编辑Show
:在实际应用程序中,值不是n 而是简单地存储一个查询;附加记录也myData
更复杂。
如果这可以带来更好的解决方案,那么确切的要求是构建地图的地图(内部地图)。每个内部映射都是同质的,Map String a
但是每个内部映射可以对其值强制使用不同的类型。您也可以将其视为两级索引结构。实现不必使用 aData.Map
但必须是高效的。
{-# LANGUAGE ExistentialQuantification #-}
module Scratch.SO_ExtistentialTypes where
import Data.Map
data HeteroValue = forall a. Show a => HV a
instance Show HeteroValue where
show (HV b) = show b
type MyMap = Map String HeteroValue
class MyClass c where
getMyMap :: c -> MyMap
data MyData = MyData {
myMap :: MyMap
}
instance MyClass MyData where
getMyMap = myMap
这个片段可以使用 ghci 运行
let myMap = fromList [("key1", HV "abc"), ("key2", HV 123)] :: MyMap
let myData = MyData myMap
getMyMap myData