这是不常见的,因为每个人都在使用
   
    State
   
   (
   
    scalaz
   
   ,
   
    cats
   
   ).
如果你使用
   
    国家
   
   -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
   
   包括语法。