首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么随机绑定的类型需要额外的StdGen?

为什么随机绑定的类型需要额外的StdGen?
EN

Stack Overflow用户
提问于 2012-07-26 17:12:38
回答 1查看 124关注 0票数 1

继续在教程中讨论,在A节中,更复杂的副作用:随机数,我得出如下结论:

代码语言:javascript
运行
复制
bind :: (a → StdGen → (b,StdGen)) → (StdGen → (a,StdGen)) → (StdGen → (b,StdGen))

当“随机函数”(作者称之为“随机函数”)的类型如下:

代码语言:javascript
运行
复制
a → StdGen -> (b,StdGen)

此外,绑定被定义为:

代码语言:javascript
运行
复制
bind f x seed = let (x',seed') = x seed in f x' seed'

问:为什么绑定在签名的末尾有一个额外的StdGen?应该是:

代码语言:javascript
运行
复制
bind :: (a → StdGen → (b,StdGen)) → (StdGen → (a,StdGen)) → (b,StdGen)

我的理由如下:

  1. Bind接受一个函数f:: a -> StdGen -> (b,StdGen)和"output“StdGen -> (a,StdGen)
  2. 它将f应用于aStdGen,并返回f签名所表示的任何内容--这就是(b, StdGen): F:A -> StdGen -> (b,StdGen)
  3. 即使在绑定实现之后,f也同时应用于值x'和类型为StdGenseed',因此它的结果必须是元组! 将f种子= let ( x‘,seed') =x种子绑定在f x’种子‘中

我哪里出错了?任何帮助都很感激!

注:对于未来的读者来说,作者对bind的定义相当于标准定义,但参数翻转的除外:flip . >>=

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-07-26 17:53:38

让我们来看看你的类型:

代码语言:javascript
运行
复制
bind :: (a → StdGen → (b,StdGen)) → (StdGen → (a,StdGen)) → (b,StdGen)

现在,我完全赞同你的第一点:

Bind接受一个函数f :: a -> StdGen -> (b,StdGen)和"output“StdGen -> (a,StdGen)

但你的第二个让我担心:

它将f应用于aStdGen

您从哪里得到a类型的值?您从哪里得到StdGen类型的值?

这两个问题的答案都是“您没有一个在撒谎”;但是,由于您确实有一个StdGen -> (a,StdGen)在撒谎,如果您有多一个StdGen参数,您就可以得到这两个问题。这就是额外参数的来源。

现在,一个稍高层次的解释。问题的一部分(我认为)是,这些类型的签名有点杂乱无章,无法轻松阅读。我们需要一些抽象概念。我们试图在这里建模的是概率分布,我们把它建模为它们的抽样函数。因此,我们可以说a上的发行版是一个知道如何从发行版中取样并返回a的函数。

代码语言:javascript
运行
复制
type Dist a = StdGen -> (a, StdGen)

现在,并不是所有的发行版都像这些一样平坦。例如,Bernoulli分布是“某种程度上的”Dist Bool,但它也是参数化的选择False的概率。我们可以这样写它的类型:

代码语言:javascript
运行
复制
bernoulli :: Double -> Dist Bool

因此,我们可以将参数化分布建模为返回分布的函数;等效地,我们可以将返回分布的函数看作参数化分布。

现在,考虑到这种高级别的解释,bind的类型变得更加可读性:

代码语言:javascript
运行
复制
bind :: (a -> Dist b) -> (Dist a -> Dist b)

这说明bind是一个函数,它告诉我们如何首先从a发行版中取样,然后在从b分发版取样时使用该a作为参数。不仅如此,使用这个类型别名,为bind编写一个没有“额外”参数的类型几乎是不可想象的。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11674516

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档