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

yon*_*ong 3 haskell

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

data Multinomial p a where
    Multinomial :: [p] -> a -> Multinomial p [a]
Run Code Online (Sandbox Code Playgroud)

我知道这是一个GADT,但它想要完成什么?难道是放置在限制pa等?

Dav*_*vid 7

它更改构造函数的返回类型.如果它是这样定义的

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].


sha*_*ang 5

至于"为什么",Distribution类型类定义rvar

class Distribution d t where
    rvar :: d t -> RVar t
Run Code Online (Sandbox Code Playgroud)

因此,给定分布的类型参数决定了从中获得的样本的类型RVar.因此,使用GADT时,Multinomial分布定义为每个样本总是返回多个值的分布,即使它只使用单个值构造a.