在random-fu包中,有这样的data
声明:
data Multinomial p a where
Multinomial :: [p] -> a -> Multinomial p [a]
Run Code Online (Sandbox Code Playgroud)
我知道这是一个GADT,但它想要完成什么?难道是放置在限制p
或a
等?
它更改构造函数的返回类型.如果它是这样定义的
data Multinomial p a = Multinomial [p] a
Run Code Online (Sandbox Code Playgroud)
我们的构造函数将具有该类型
Multinomial :: [p] -> a -> Multinomial p a
Run Code Online (Sandbox Code Playgroud)
GADT将构造函数的结果类型中的第二个类型参数更改为[a]
.
至于"为什么",Distribution
类型类定义rvar
为
class Distribution d t where
rvar :: d t -> RVar t
Run Code Online (Sandbox Code Playgroud)
因此,给定分布的类型参数决定了从中获得的样本的类型RVar
.因此,使用GADT时,Multinomial
分布定义为每个样本总是返回多个值的分布,即使它只使用单个值构造a
.