使用Scala中的单个函数在列表和向量中的int元素之和



如何使此代码工作?

sealed abstract class Addable[A] {
  def sum(el: Seq[A]): A
}
class MyAddable[A]() extends Addable[A] {
  override def sum(el: Seq[A]): A = {
    el.sum
  }
}
val myvec = Vector(1, 2, 3)
val mylist = List(1, 2, 3)
val inst = new MyAddable
val res0 = inst.sum(mylist) // should return 6
val res1 = inst.sum(myvec)  // should return 6
println(s"res0 = $res0")
println(s"res1 = $res1")

我想传递通用数据类型(vector/list [int](,并使用所描述的签名和代码结构获取其元素的总和。

目前我得到了:

found   : immutable.this.List[scala.this.Int]
 required: Seq[scala.this.Nothing]

scalafiddle

特定错误在这里:

val inst = new MyAddable

应该是

val inst = new MyAddable[Int]()

MyAddable是通用的,但您没有指定类型,因此它假设Nothing,因此错误消息。

sealed abstract class Addable[A] {
  def sum(el: Seq[A]): A
}
class MyAddable[A: Numeric]() extends Addable[A] {
  override def sum(el: Seq[A]): A = {
    el.sum
  }
}
val myvec = Vector(1, 2, 3)
val mylist = List(1, 2, 3)
val inst = new MyAddable[Int]()
val res0 = inst.sum(mylist)
val res1 = inst.sum(myvec)
println(s"res0 = $res0")
println(s"res1 = $res1")
import cats.{Semigroup}
import cats.implicits._
// Specify a generic Reduce Function. Use Contravariant parameter to support reduce on derived types   
trait Reduce[-F[_]] {
  def reduce[A](fa:F[A])(f:(A,A) => A):A
}    
object Reduce {      
  implicit val SeqReduce  = new Reduce[Seq] {
    def reduce[A] (data:Seq[A])(f:(A,A) => A ):A = data reduce f 
  }
  implicit val OptReduce  = new Reduce[Option] {
    def reduce[A] (data:Option[A])(f:(A,A) => A ):A = data reduce f
  }        
}
// Generic sum function
def sum[A:Semigroup, F[_]](container: F[A])(implicit red:Reduce[F]):A = {
  red.reduce(container)(Semigroup.combine(_,_))
} 
  val myvec   = Vector(1, 2, 3)
  val mylist  = List  (1, 2, 3)
  val mymap   = Map ( 1 -> "one",
                      2 -> "two",
                      3 -> "three"
                    )
  val myopt   = Some(1)
  val res0  = sum(myvec)
  val res1  = sum(mylist)
  val res2  = sum(myopt)      
  println(s"res0 = $res0")
  println(s"res1 = $res1")
  println(s"res2 = $res2")

对于地图而言,这会变得更加复杂

最新更新