1

我尝试使用我的函数 sum_ 重写这行 Scala + Figaro,但我有一些错误。

val sum = Container(vars:_*).reduce(_+_)

它使用 reduce() 方法来计算总和。我想重写这一行,但由于 Chain 返回类型 [Double, Int] 而出现错误:

import com.cra.figaro.language._
import com.cra.figaro.library.atomic.continuous.Uniform
import com.cra.figaro.language.{Element, Chain, Apply}
import com.cra.figaro.library.collection.Container

object sum {  
  def sum_(arr: Int*) :Int={
    var i=0
    var sum: Int =0
    while (i < arr.length) {
      sum += arr(i)
      i += 1
    } 
    return sum     
  } 

  def fillarray(): Int = {
    scala.util.Random.nextInt(10) match{
      case 0 | 1 | 2 => 3
      case 3 | 4 | 5 | 6 => 4
      case _ => 5
    }
  }


  def main(args: Array[String]) {  
    val par = Array.fill(18)(fillarray())
    val skill = Uniform(0.0, 8.0/13.0)
    val shots = Array.tabulate(18)((hole: Int) => Chain(skill, (s:Double) =>
                                                 Select(s/8.0 -> (par(hole)-2),
                                                        s/2.0 -> (par(hole)-1),
                                                        s -> par(hole),
                                                        (4.0/5.0) * (1.0 - (13.0 * s)/8.0)-> (par(hole)+1),                                                       
                                                        (1.0/5.0) * (1.0 - (13.0 * s)/8.0) -> (par(hole)+2)))) 

    val vars = for { i <- 0 until 18} yield shots(i)

    //this line I want to rewrite
    val sum1 = Container(vars:_*).reduce(_+_)

    //My idea was to implement in this way the line above
    val sum2 = sum_(vars)
  }
}
4

1 回答 1

1

如果你想使用你的功能,你可以这样做:

val sum2 = sum_(vars.map(chain => chain.generateValue()):_*)

或者

val sum2 = sum_(vars.map(_.generateValue()):_*)

但我建议深入了解您的库和功能范式。

于 2019-11-12T11:41:00.817 回答