小编use*_*242的帖子

"Scala编程"中的合并排序会导致堆栈溢出

直接剪切和粘贴以下算法:

def msort[T](less: (T, T) => Boolean)
            (xs: List[T]): List[T] = {
  def merge(xs: List[T], ys: List[T]): List[T] =
    (xs, ys) match {
      case (Nil, _) => ys
      case (_, Nil) => xs
      case (x :: xs1, y :: ys1) =>
        if (less(x, y)) x :: merge(xs1, ys)
        else y :: merge(xs, ys1)
    }
  val n = xs.length / 2
  if (n == 0) xs
  else {
    val (ys, zs) = xs splitAt n
     merge(msort(less)(ys), msort(less)(zs))
  }
}
Run Code Online (Sandbox Code Playgroud)

导致5000个长列表上的StackOverflowError.

有没有办法优化这个,以便不会发生这种情况?

stack-overflow recursion scala

11
推荐指数
2
解决办法
4613
查看次数

具有多个测试用例的Scalatest或specs2

在TestNg和Java中,我们可以使用DataProvider运行多个测试用例,这可以作为单独的测试运行,这意味着测试的执行不会在失败时停止.是否有ScalaTest或Specs/Specs2的模拟?

scala scalatest specs2

10
推荐指数
2
解决办法
7143
查看次数

无法使用隐式转换为Comparable提供从DateTime到Ordered的隐式转换

我正在尝试使用DateTime(joda)使用> =,>等,而我能让它工作的唯一方法就是使用这种隐式转换

implicit def dateTime2ordered(x: DateTime): Ordered[DateTime] =
new Ordered[DateTime] with Proxy {
  val self = x

  def compare(y: DateTime): Int = {
    x.compareTo(y)
  }
}
Run Code Online (Sandbox Code Playgroud)

我更喜欢更通用的形式,如

implicit def comparable2ordered[A <: Comparable[A]](x: A): Ordered[A] =
    new Ordered[A] with Proxy {
      val self = x

      def compare(y: A): Int = {
        x.compareTo(y)
      }
    } 
Run Code Online (Sandbox Code Playgroud)

但是编译器找不到这种转换,并且在尝试直接调用它之后,我得到了以下消息,声称DateTime不是Comparable类型[A].在检查DateTime的源代码后,我看到它只将Comparable实现为原始类型.

我能够使用它

 implicit def comparable2ordered[A <: Comparable[_]](x: A): Ordered[A] =
    new Ordered[A] with Proxy {
      val self = x

      def compare(y: A): Int = {
        x.compareTo(y)
      } …
Run Code Online (Sandbox Code Playgroud)

scala

8
推荐指数
2
解决办法
2399
查看次数

是否可以使用隐式证据来强制抽象类型之间的静态类型兼容性?

假设以下特征:

trait A {
  type B
  def +(a:A):A
}
Run Code Online (Sandbox Code Playgroud)

我使用抽象类型,因为我不想在每次需要A时在类型签名中拖动B.是否仍然可以添加任何隐式证据(使用=:=,<:<等等) +方法,以便编译器仍然可以强制接受a:具有相同B的A?

我的第一直觉是说不,但斯卡拉以前让我惊喜.任何帮助,将不胜感激.

scala

8
推荐指数
1
解决办法
628
查看次数

有没有类似于TestNg dependsOnMethods注释的scalaTest机制

我是否可以在scalaTest规范之间存在依赖关系,以便在测试失败时,将跳过所有依赖于它的测试?

scala scalatest

8
推荐指数
1
解决办法
1911
查看次数

特征和抽象类型

假设我有一个基类

abstract class Base {

  type B<: Base

  def rep:String

  def copy:B
}

class MyBase(override val rep:String) extends Base {
  type B = MyBase

 override def copy = new MyBase(rep)
}
Run Code Online (Sandbox Code Playgroud)

然后我尝试添加另一个特性作为mixin,我希望复制的返回类型是适当的类型(意味着在mixin上调用copy会返回mixin类型,通过将B设置为适当的类型).我无法编译,甚至无法理解override关键字的位置.

编辑:我已经改进了这个例子

abstract class Base {


  type B <: Base

  def rep:String

  def copy:B

}

class MyBase(val rep:String) extends Base {

  type B = MyBase

  def copy = new MyBase(rep)
}


trait DecBase extends Base {

  abstract override def rep = "Rep: "+super.rep   
}
Run Code Online (Sandbox Code Playgroud)

我的问题是,如何为DecBase声明一个合适的B类和复制方法,以便该副本返回一个DecBase,而且,为什么不编译?

println(((new MyBase("ofer") with DecBase)).rep) …
Run Code Online (Sandbox Code Playgroud)

scala

6
推荐指数
1
解决办法
1068
查看次数

Scala编译器无法识别视图绑定

我试过这行代码

def **[A <% Numeric[A]](l:List[A],m:List[A])=l.zip(m).map({t=>t._1*t._2})
Run Code Online (Sandbox Code Playgroud)

但是在编译时,我收到了这个错误

error: value * is not a member of type parameter A
def **[A <% Numeric[A]](l:List[A],m:List[A])=l.zip(m).map({t=>t._1*t._2})
Run Code Online (Sandbox Code Playgroud)

当我查看数字特征的来源时,我看到了一个*操作定义.

我究竟做错了什么?

scala

2
推荐指数
1
解决办法
1396
查看次数

我的方法和Predef中的conforms之间隐含歧义的问题

以下代码取自Apocalisp的优秀博客系列: scala中的类型级编程,并针对隐式解析方案进行了修改.但是,这不会编译,并显示以下消息:

error: ambiguous implicit values:
both method hParseNil in object HApplyOps of type => (com.mystuff.bigdata.commons.collections.hlist.HNil) => com.mystuff.bigdata.commons.collections.hlist.HNil
and method conforms in object Predef of type [A]<:<[A,A]
match expected type (com.mystuff.bigdata.commons.collections.hlist.HNil) => com.amadesa.bigdata.commons.collections.hlist.HNil
val l = hparse[HNil,HNil](HNil)
Run Code Online (Sandbox Code Playgroud)

有人可以解释为什么会发生这种情况,以及它是否可以修复?

sealed trait HList

final case class HCons[H, T <: HList](head: H, tail: T) extends HList {
  def :+:[T](v: T) = HCons(v, this)
}

sealed class HNil extends HList {
  def :+:[T](v: T) = HCons(v, this)
}

object HNil extends HNil

// …
Run Code Online (Sandbox Code Playgroud)

scala

2
推荐指数
1
解决办法
867
查看次数

标签 统计

scala ×8

scalatest ×2

recursion ×1

specs2 ×1

stack-overflow ×1