小编0__*_*0__的帖子

如何在Scala中使用通配符来获得更高级的类型?

比方说我有这个特点

trait Ctx[C, V[_]]
Run Code Online (Sandbox Code Playgroud)

我无法构造任何采用Ctx的方法签名,其中第二个类型参数未指定(通配符).例如:

def test(c: Ctx[_, _]) = ()
Run Code Online (Sandbox Code Playgroud)

不编译("error: _$2 takes no type parameters, expected: one").我也不能这样做

def test(c: Ctx[_, _[_]]) = ()
Run Code Online (Sandbox Code Playgroud)

("error: _$2 does not take type parameters").我错过了什么?

scala wildcard higher-kinded-types

7
推荐指数
1
解决办法
2510
查看次数

从MurmurHash迁移到MurmurHash3

在Scala 2.10中,MurmurHash由于某种原因被弃用,说我MurmurHash3现在应该使用.但是API是不同的,并且没有有用的scaladoc用于MurmurHash3- >失败.

例如,当前代码:

trait Foo {
  type Bar
  def id: Int
  def path: Bar

  override def hashCode = {
    import util.MurmurHash._
    var h = startHash(2)
    val c = startMagicA
    val k = startMagicB
    h = extendHash(h, id, c, k)
    h = extendHash(h, path.##, nextMagicA(c), nextMagicB(k))
    finalizeHash(h)
  }
}
Run Code Online (Sandbox Code Playgroud)

我该如何使用MurmurHash3呢?这需要一个快速的操作,最好不分配,所以我不希望建立一个Product,Seq,Array[Byte]或whathever MurmurHash3似乎为我提供.

hash scala murmurhash

7
推荐指数
1
解决办法
2709
查看次数

字符串插值转义引用PITA

它让我发疯,字符串插值有一些特殊的规则,不允许从a + b样式直接转换:

// ok
def test(f: java.io.File) = {
  val abs = f.getAbsoluteFile
  val isF = abs.isFile
  "select " + (if (isF) "file" else "folder") +"\"" + abs.getName +"\" of folder"
}

// fail
def test(f: java.io.File) = {
  val abs = f.getAbsoluteFile
  val isF = abs.isFile
  s"select ${if (isF) "file" else "folder"} \"${abs.getName}\" of folder"
}
Run Code Online (Sandbox Code Playgroud)

然后有一个可爱的错误消息:

<console>:38: error: value $ is not a member of String
         s"select ${if (isF) "file" else "folder"} \"${abs.getName}\" of folder …
Run Code Online (Sandbox Code Playgroud)

scala string-interpolation

7
推荐指数
1
解决办法
5496
查看次数

通过将类型参数与参数的路径相关类型进行匹配来约束操作

我想利用Scala的类型系统来约束系统中的操作,在该系统中存在对某些值的版本化引用.这一切都发生在一些附加Ctx了版本类型的事务上下文中V.现在有一个Factory创建引用变量.它们是通过附加它们的创建版本(类型参数V1)创建的,对应于调用工厂的上下文版本.

现在想象一些代码试图在更高版本中访问该引用,即使用不同的代码Ctx.我想要实现的是禁止Ref在与创建版本不匹配的任何版本(CtxV类型字段)中调用访问权限,但允许您通过一些返回新的替换机制来解析引用Ref在当前版本中可以访问的视图.(如果substitute使用无效的上下文调用它是可以的,例如一个比Refs 更旧的V1- 在这种情况下可能抛出运行时异常)

这是我的尝试:

trait Version

trait Ctx {
  type V <: Version
}

object Ref {
  implicit def access[C <: Ctx, R, T](r: R)(implicit c: C, view: R => Ref[C#V, T]): T =
    view(r).access(c)

  implicit def substitute[C <: Ctx, T](r: Ref[_ <: Version, T])
                                      (implicit c: C): Ref[C#V, T] = …
Run Code Online (Sandbox Code Playgroud)

scala type-constraints type-parameter path-dependent-type

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

缺少非详尽匹配的警告

-unchecked启用时,为什么以下内容不会产生警告:

object Order {
   sealed trait EntryOption
   case object EmptyEntry extends EntryOption
   trait Entry extends EntryOption

   def isEmpty(a: EntryOption): Boolean = a match {
      case EmptyEntry => true
//    case _: Entry   => false
   }
}
Run Code Online (Sandbox Code Playgroud)

在Scala 2.8.0 之前,我似乎遇到了完全相同的问题,没有足够的答案.


编辑

@Jed对我来说,仅对非抽象类发出警告是没有意义的Entry.考虑以下情况:

trait Order {
  sealed trait EntryOption
  case object EmptyEntry extends EntryOption
  abstract sealed class Entry extends EntryOption

  def isEmpty(a: EntryOption): Boolean = a match {
    case EmptyEntry => true
 // case _: Entry …
Run Code Online (Sandbox Code Playgroud)

scala pattern-matching

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

交换证据参数的类型参数的上限

我想放宽对特征类型参数的约束,而是将它们以证据参数的形式强加给方法.鉴于一些骨架设置:

trait State[Repr]
object Observer {
  def apply[Repr <: State[Repr]](reader: Reader[Repr]): Observer[Repr] = 
    new Observer[Repr] {}
}
trait Observer[A]
trait Reader  [A]
Run Code Online (Sandbox Code Playgroud)

这有效:

trait StateX[Repr <: StateX[Repr]] extends State[Repr] { 
  protected def reader: Reader[Repr]
  def observe: Observer[Repr] = Observer(reader)
}
Run Code Online (Sandbox Code Playgroud)

而这不是:

trait StateY[Repr] extends State[Repr] { 
  protected def reader: Reader[Repr]
  def observe(implicit ev: Repr <:< State[Repr]): Observer[Repr] = Observer(reader)
}
Run Code Online (Sandbox Code Playgroud)

随着消息"inferred type arguments [Repr] do not conform to method apply's type parameter bounds [Repr <: State[Repr]]".由于证据ev表明这种构象,我想知道如何 …

scala implicit type-parameter

6
推荐指数
2
解决办法
295
查看次数

scaladoc的手册页在哪里?

看着http://www.scala-sbt.org/release/docs/Howto/scaladoc.html有给了scaladoc选择这样的例子-groups-implicits.

有关scaladoc(2.10)选项的信息在哪里?就像一个手册页.我似乎无法找到它,既不是docs.scala-lang.org,也不是wiki.scala-lang.org ......

除了由sbt管理之外我不使用Scala安装,所以我真的想要一个在线资源.

scala scaladoc

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

是否可以使用次要版本更新来更新传递依赖性?

让我们说我foo从版本1.0.0到库创建了我的库的二进制兼容更新1.0.1.图书馆foo通过Maven发布.

我是否可以使用此次要版本更新来同时修复依赖项的次要版本foo?例如,版本1.0.0正在使用scalaVersion := "2.10.1".我可以将其更改为scalaVersion := "2.10.3"foo 1.0.1,还是会导致麻烦?

假设我foo在另一个项目中使用

"mygroup" %% "foo" % "1.0.+"
Run Code Online (Sandbox Code Playgroud)

scala backwards-compatibility maven sbt

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

将F有界类型表示为抽象类型成员

我想将F有界多态转换为抽象类型成员.

trait FBoundedMovable[Self <: FBoundedMovable[Self]] {
  def moveTo(pos: Vect2): Self
}
Run Code Online (Sandbox Code Playgroud)

trait Movable { self =>
  type Self <: (Movable { type Self = self.Self })

  def moveTo(pos: Vect2): Self
}
Run Code Online (Sandbox Code Playgroud)

到现在为止还挺好.

让我们定义一个实例:

case class Ship(pos: Vect2) extends Movable {
  type Self = Ship

  def moveTo(pos: Vect2) = copy(pos = pos)
}
Run Code Online (Sandbox Code Playgroud)

并尝试使用它:

// [error]  found   : a.Self
// [error]  required: A
  def move[A <: Movable](a: A, to: Vect2): A = a.moveTo(to)
Run Code Online (Sandbox Code Playgroud)

F有界版本工作正常.

def moveF[A <: FBoundedMovable[A]](a: A, to: …

scala abstract-type parametric-polymorphism f-bounded-polymorphism

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

当使用中间变量时,理解失败

Scastie版本

有了这个基础结构:

trait Pat[A]
object Pat {
  def apply[A](elems: A*): Pat[A] = ???
}

implicit class PatOps[A](p: Pat[A]) {
  def ++ (that: Pat[A]): Pat[A] = ???

  def bubble: Pat[Pat[A]] = ???

  def grouped(size: Pat[Int]): Pat[Pat[A]] = ???
}

implicit class PatPatOps[A](p: Pat[Pat[A]]) {
  def map[B](f: Pat[A] => Pat[B]): Pat[Pat[B]] = ???

  def flatMap[B](f: Pat[A] => Pat[B]): Pat[B] = ???

  def flatten: Pat[A] = ???
}
Run Code Online (Sandbox Code Playgroud)

可以写下以下的理解:

trait Test1 {
  val lPat = Pat(1, 2, 3)
  val xs = for { …
Run Code Online (Sandbox Code Playgroud)

scala pattern-matching

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