在y-taka-23改编自LYAH中,我发现第13章的大部分片段必须处理缺乏State构造函数的问题,例如原始的Haskell代码:
randomSt = State random 被改写为:
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是一种抽象的数据类型。是否有可能定义新的具体数据类型,并从中派生出来并使用它的构造函数?
发布于 2016-02-10 18:30:13
你就不能写个聪明的构造函数吗?
state :: (s -> (a, s)) -> State s a
state f = do
s <- State.get
let (x, s') = f s
State.put s'
return x写一次(也许在你可以下载的库中?)然后在任何你需要的地方使用它。
发布于 2016-02-10 20:27:46
实际上,构造一些特定的状态实例
State random这是相当优雅的,在Frege中是不可能的,因为State数据构造函数是不可访问的。这是不幸的,但它也保护您不编写依赖于某些实现细节的代码。
例如,我正在粗略地为Frege开发一个新的后端,它利用Java lambdas并尝试发出typesafe泛型Java代码,在此过程中,我发现我需要为State提供另一个表示形式。因此,在下一个Frege版本中,不再存在以函数作为参数的State构造函数了。
尽管进行了这种更改,而且编译器的大部分由状态操作组成,但我没有为此而更改编译器代码中的任何一行。我也可以确定我不会伤害其他人的代码。大胜!
总之,我觉得我们可以在标准库中包括@jcast的智能状态构造函数。(我只是把“让”改写成一个案例。)
https://stackoverflow.com/questions/35321657
复制相似问题