这些数据是什么......试图完成的是什么? (Haskell的)

时间:2014-08-13 23:27:12

标签: haskell

在random-fu包中,有data声明:

data Multinomial p a where
    Multinomial :: [p] -> a -> Multinomial p [a]

我知道这是一个GADT,但是它想要完成什么?是对p还是a等进行限制?

2 个答案:

答案 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的单个值构建。