Data.IxSet
库的 ixset
提供了多列表,其中包含每列的索引和不存在列的计算索引。
如何在未编制索引的列中放置抽象值?
这是一个例子。我有Lib
模块导出Abstract
类型,没有任何构造函数,但有一些函数来操作不透明值。
module Lib (Abstract, makeAbstract) where
data Abstract = Abstract (Int -> Int)
makeAbstract x = Abstract (\x -> 42 * x + y)
我可以使用Map String Abstract
这样的法线贴图,因为值类型不受限制。但我不能IxSet Table
(Map String Abstract, Map Int Abstract)
:
module User where
import Lib
data Table = Table { tKey1 :: String, tKey2 :: Int, tValue :: Abstract }
因为我需要提供instance Data Table
。理想情况下,我希望newtype Opaque a = Opaque a
拥有所有a
所有必需实例,而不对其施加约束,并使用以下内容:
data Table = Table { tKey1 :: String, tKey2 :: Int, tValue :: Opaque Abstract }
deriving (Data, Typable, ...)