首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Frege中创建国家实例

在Frege中创建国家实例
EN

Stack Overflow用户
提问于 2016-02-10 17:13:27
回答 2查看 84关注 0票数 3

y-taka-23改编自LYAH中,我发现第13章的大部分片段必须处理缺乏State构造函数的问题,例如原始的Haskell代码:

代码语言:javascript
复制
randomSt = State random 

被改写为:

代码语言:javascript
复制
randomSt = do
    gen <- State.get
    let (x, newGen) = random gen
    State.put newGen
    return x 

这当然有它自己的说教的优点!但是,我想知道是否有另一种方法来创建State实例。我知道,Frege和Haskell之间的这种差异来自于Frege的State s a模块中的Control.monad.State是一种抽象的数据类型。是否有可能定义新的具体数据类型,并从中派生出来并使用它的构造函数?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-02-10 18:30:13

你就不能写个聪明的构造函数吗?

代码语言:javascript
复制
state :: (s -> (a, s)) -> State s a
state f = do
    s <- State.get
    let (x, s') = f s
    State.put s'
    return x

写一次(也许在你可以下载的库中?)然后在任何你需要的地方使用它。

票数 3
EN

Stack Overflow用户

发布于 2016-02-10 20:27:46

实际上,构造一些特定的状态实例

代码语言:javascript
复制
State random

这是相当优雅的,在Frege中是不可能的,因为State数据构造函数是不可访问的。这是不幸的,但它也保护您不编写依赖于某些实现细节的代码。

例如,我正在粗略地为Frege开发一个新的后端,它利用Java lambdas并尝试发出typesafe泛型Java代码,在此过程中,我发现我需要为State提供另一个表示形式。因此,在下一个Frege版本中,不再存在以函数作为参数的State构造函数了。

尽管进行了这种更改,而且编译器的大部分由状态操作组成,但我没有为此而更改编译器代码中的任何一行。我也可以确定我不会伤害其他人的代码。大胜!

总之,我觉得我们可以在标准库中包括@jcast的智能状态构造函数。(我只是把“让”改写成一个案例。)

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

https://stackoverflow.com/questions/35321657

复制
相关文章

相似问题

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