異種のインデックス構造を構築しようとしていて、次の解決策を思いつきましたが、存在する型を使用しないように言われました。
より良い解決策が見えますか?
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