gpt4 book ai didi

scala - 如何避免使用错误版本数据的错误?

转载 作者:行者123 更新时间:2023-12-04 16:49:24 25 4
gpt4 key购买 nike

我正在尝试学习函数式编程,所以我正在使用纯函数式编程编写一个简单的编译器:Scala,在任何地方都没有“var”,也没有可变结构。

我有一个“已评估函数”的缓存,以加快编译速度并在某些情况下避免无限递归。在命令式方法中,这将是对某处大型可变哈希映射的引用。但在函数式方法中,它更像是下面的代码(经过大量简化和解释,请原谅任何语法错误)。

def compileAdd(
cache0: Cache,
uncompiledLeftSubExpr: UncompiledExpr,
uncompiledRightSubExpr: UncompiledExpr)
: (Cache, CompiledExpr) = {
val (cache1, compiledLeftSubExpr) =
compileExpression(cache0, uncompiledLeftSubExpr)
val (cache2, compiledRightSubExpr) =
compileExpression(cache1, uncompiledRightSubExpr)
val newExpression =
AddExpression(compiledLeftSubExpr, compiledRightSubExpr)
(cache2, newExpression)
}

但是,想象一下,如果我有一个错误,最后一行是:
   (cache1, newExpression)

我一直这样做。这是我的重构后错误的主要来源;移动代码后,我不可避免地忘记更新其中一个“版本号”并不小心使用了旧版本。

这是一个常见的错误吗?怎么避免呢?

我会使用 do-syntax,但这让我觉得它只是一个更复杂的“var”。我一定是在想这个错误...

最佳答案

这并不常见,因为每个人都在使用 State ( scalazcats )。
如果您使用 State -monad(例如来自上述库之一),您的示例应该看起来像这样:

def compileAdd(
uncompiledLeftSubExpr: UncompiledExpr,
uncompiledRightSubExpr: UncompiledExpr
): State[Cache, CompiledExpr] = for {
compiledLeftSubExpr <- compileExpression(uncompiledLeftSubExpr)
compiledRightSubExpr <- compileExpression(uncompiledRightSubExpr)
} yield AddExpression(compiledLeftSubExpr, compiledRightSubExpr)

更确切地说
def compileAdd(
left: UncompiledExpr,
right: UncompiledExpr
): State[Cache, CompiledExpr] = for {
a <- compileExpression(left)
b <- compileExpression(right)
} yield AddExpression(a, b)

这假设 compileExpression也有签名
def compileExpression(u: UncompiledExpr): State[Cache, CompiledExpr]

并且所有带有隐式转换的导入都提供了 for-yield包括语法。

关于scala - 如何避免使用错误版本数据的错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51504282/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com