異種のインデックス構造を構築しようとしていて、次の解決策を思いつきましたが、存在する型を使用しないように言われました。
より良い解決策が見えますか?
type
インターフェイスの定義 (とclass
) と具体的な実装 (data
と)を分離したいと思いますinstance
。@hammar のコメントに従って編集Show
します。またmyData
、追加のレコードでより複雑になります。
これがより良い解決策につながる場合、正確な要件は、マップのマップ (内部マップ) を構築することです。各内部マップは同種で、次の形式になっていますが、Map String a
各内部マップはその値に異なる型を適用する場合があります。また、2 レベルのインデックス構造と考えることもできます。実装は a を使用するData.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