我有一个数据类型,它表示与概率配对的值的集合。起初,实现只是使用良好的旧列表,但正如您可以想象的那样,这可能是低效的(例如,我使用树而不是列表来存储有序值)
经过一番研究,我想到了使用 GADT
data Tree a b = Leaf | Node {left::Tree a b, val :: (a, b), right :: Tree a b}
data Prob a where
POrd ::Ord a => Tree a Rational -> Prob a
PEq ::Eq a => [(a, Rational)] -> Prob a
PPlain ::[(a, Rational)] -> Prob a
到目前为止,一切都很好。我现在坚持尝试为我的新数据类型创建一个智能构造函数,该构造函数接受[(a,Rational)]并根据 的约束a选择正确的构造函数Prob。基本上:
prob :: [(a, Rational)] -> Prob a
-- chooses the "best" constructor based on the constraints of a
这是可能吗?如果没有,我应该如何设计更好的东西?我错过了什么吗?
谢谢!