我正在尝试获取有关 SBV 中分支性能特征的一些基本信息。
假设我有SInt16
一个非常稀疏的查找表Map Int16 a
。我可以使用嵌套实现查找ite
:
sCase :: (Mergeable a) => SInt16 -> a -> Map Int16 a -> a
sCase x def = go . toList
where
go [] = def
go ((k,v):kvs) = ite (x .== literal k) v (go kvs)
但是,这意味着生成的树将非常深。
- 这有关系吗?
- 如果是,是否更好地生成一个平衡的分支树,有效地反映
Map
's 的结构?还是有其他方案可以提供更好的性能? - 如果地图中的条目少于 256 个,它是否会更改任何内容以“压缩”它以便
sCase
适用于 anSInt8
和 aMap Int8 a
? - 对于这个用例,是否有一些内置的 SBV 组合器比 iterated 效果更好
ite
?
编辑:事实证明,我的身份很重要a
,所以让我添加更多细节。我目前正在使用以下实例sCase
在建模为 的有状态计算中进行分支:RWS r w s a
instance forall a. Mergeable a => Mergeable (Identity a) where
symbolicMerge force cond thn els = Identity $ symbolicMerge force cond (runIdentity thn) (runIdentity els)
instance (Mergeable s, Mergeable w, Mergeable a, forall a. Mergeable a => Mergeable (m a)) => Mergeable (RWST r w s m a) where
symbolicMerge force cond thn els = Lazy.RWST $
symbolicMerge force cond (runRWST thn) (runRWST els)
所以剥离所有的newtype
s,我想分支到r -> s -> (a, s, w)
st和st 类型Mergeable s
的东西。Mergeable w
Mergeable a