在random-fu包中,有data
声明:
data Multinomial p a where
Multinomial :: [p] -> a -> Multinomial p [a]
我知道这是一个GADT,但是它想要完成什么?是对p
还是a
等进行限制?
答案 0 :(得分:7)
它更改构造函数的返回类型。如果它是这样定义的
data Multinomial p a = Multinomial [p] a
我们的构造函数将具有类型
Multinomial :: [p] -> a -> Multinomial p a
GADT将构造函数的结果类型中的第二个类型参数更改为[a]
。
答案 1 :(得分:5)
至于“为什么”,Distribution
类型类将rvar
定义为
class Distribution d t where
rvar :: d t -> RVar t
因此,给定分布的类型参数决定了从RVar
中获得的样本的类型。因此,使用GADT时,Multinomial
分布被定义为每个样本总是返回多个值的分布,即使它只使用a
的单个值构建。