小编bet*_*ess的帖子

如何从投影类型推断出正确的类型参数?

我有一些麻烦让Scala从类型投影中推断出正确的类型.

考虑以下:

trait Foo {
  type X
}

trait Bar extends Foo {
  type X = String
}

def baz[F <: Foo](x: F#X): Unit = ???
Run Code Online (Sandbox Code Playgroud)

然后以下编译好:

val x: Foo#X = ???    
baz(x)
Run Code Online (Sandbox Code Playgroud)

但以下内容无法编译:

val x: Bar#X = ???    
baz(x)
Run Code Online (Sandbox Code Playgroud)

斯卡拉认为"基础String类型"的x,但已失去了信息xBar#X.如果我注释类型,它工作正常:

baz[Bar](x)
Run Code Online (Sandbox Code Playgroud)

有没有办法让Scala推断出正确的类型参数baz
如果没有,那么一般的答案是什么让它变得不可能?

polymorphism scala type-inference type-projection

11
推荐指数
1
解决办法
343
查看次数

Play应用中的specs/scalatest交互问题

我遇到了一个我无法解释的问题......在https://github.com/betehess/play-scalatest的项目中它是孤立的.

当我运行时test,sbt卡住一段时间然后抛出此异常:

> test
[error] Uncaught exception when running tests: java.net.ConnectException: Connection timed out
Exception in thread "Thread-1" java.net.SocketException: Connection reset
    at java.net.SocketInputStream.read(SocketInputStream.java:196)
    at java.net.SocketInputStream.read(SocketInputStream.java:122)
    at java.net.SocketInputStream.read(SocketInputStream.java:210)
    at java.io.ObjectInputStream$PeekInputStream.peek(ObjectInputStream.java:2293)
    at java.io.ObjectInputStream$BlockDataInputStream.readBlockHeader(ObjectInputStream.java:2473)
    at java.io.ObjectInputStream$BlockDataInputStream.refill(ObjectInputStream.java:2543)
    at java.io.ObjectInputStream$BlockDataInputStream.skipBlockData(ObjectInputStream.java:2445)
    at java.io.ObjectInputStream.skipCustomData(ObjectInputStream.java:1941)
    at java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1620)
    at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1517)
    at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1771)
    at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1350)
    at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:1990)
    at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1915)
    at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1798)
    at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1350)
    at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:1990)
    at java.io.ObjectInputStream.defaultReadObject(ObjectInputStream.java:500)
    at java.lang.Throwable.readObject(Throwable.java:914)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:606)
    at java.io.ObjectStreamClass.invokeReadObject(ObjectStreamClass.java:1017)
    at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1893)
    at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1798)
    at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1350) …
Run Code Online (Sandbox Code Playgroud)

scala sbt scalatest playframework specs2

10
推荐指数
1
解决办法
788
查看次数

解释scalaz-7中的Traverse [List]实现

我试图理解scalaz-7中traverseImpl实现:

def traverseImpl[F[_], A, B](l: List[A])(f: A => F[B])(implicit F: Applicative[F]) = {
  DList.fromList(l).foldr(F.point(List[B]())) {
     (a, fbs) => F.map2(f(a), fbs)(_ :: _)
  }
}
Run Code Online (Sandbox Code Playgroud)

有人可以解释如何ListApplicative?进行交互?最后,我希望能够实现其他实例Traverse.

scala traversal typeclass scalaz applicative

7
推荐指数
2
解决办法
1242
查看次数

暂停用户输入的进程[任务,O]

我正在尝试编写以下函数

def haltOnUserInput[O](process: Process[Task, O]): Process[Task, O]
Run Code Online (Sandbox Code Playgroud)

process当用户发送一行时停止stdin.在这种情况下,可以在结束进程本身之前等待进程中的当前计算结束.

我尝试过以下方法:

scala> :paste
// Entering paste mode (ctrl-D to finish)

import scalaz.{ -\/, \/-, \/ }
import scalaz.stream._
import scalaz.concurrent.Task

def haltOnUserInput[O](process: Process[Task, O]): Process[Task, O] = {
  process.either(io.stdInLines).flatMap {
    case -\/(o) => Process.emit(o)
    case \/-(_) => println("here"); Process.halt
  }
}
Run Code Online (Sandbox Code Playgroud)

而我正在测试:

scala> val oneSec = scala.concurrent.duration.Duration("1s")
oneSec: scala.concurrent.duration.Duration = 1 second

scala> val test = haltOnUserInput(Process.awakeEvery(oneSec)).take(10).map(_.toString).to(io.stdOutLines).run
test: scalaz.concurrent.Task[Unit] = scalaz.concurrent.Task@7a5e41bb

scala> test.run
1000144294 nanoseconds
2000148316 nanoseconds
here
3000130736 …
Run Code Online (Sandbox Code Playgroud)

scala scalaz scalaz-stream

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

cat中的预期行为 - 对.delay`或`.map`中引发的异常的影响

在PR审查期间,我被要求替换Sync[F].delay,Sync[F].catchNonFatal因为可能会抛出异常.

这确实有效:

scala> Sync[IO].delay(throw new Exception).recover{ case t: Throwable => 42 }.unsafeRunSync
res10: Int = 42
Run Code Online (Sandbox Code Playgroud)

不确定这种行为是否具体IO,我也能找到相应的法律说它实际上是预期的,但我在主要的cat-effect文档中找不到关于API中异常的自动处理的提及.

有谁知道的理由和预期的行为,然后猫效应WRT异常抛出.delay.map.flatMap

scala scala-cats cats-effect

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

公开来自单例类型的路径依赖类型

我正在尝试让Scala为来自单例类型的路径依赖类型找到正确的类型.

首先,这是示例的类型容器,以及一个实例:

trait Container {
  type X
  def get(): X
}

val container = new Container {
  type X = String
  def get(): X = ""
}
Run Code Online (Sandbox Code Playgroud)

我可以在第一次尝试中看到String(所以我已经有了一个工作场景):

class WithTypeParam[C <: Container](val c: C) {
  def getFromContainer(): c.X = c.get()
}

val withTypeParam = new WithTypeParam[container.type](container)

// good, I see the String!
val foo: String = withTypeParam.getFromContainer()
Run Code Online (Sandbox Code Playgroud)

但是当没有类型参数时,这不再起作用.

class NoTypeParam(val c: Container) {
  def getFromContainer(): c.X = c.get()
}

val noTypeParam = new NoTypeParam(container)

// this does *not* compile
val …
Run Code Online (Sandbox Code Playgroud)

scala type-parameter path-dependent-type dependent-method-type

5
推荐指数
1
解决办法
176
查看次数

使用依赖方法类型和类型投影时,键入等效问题

我正在使用Scala 2.10.0-M1尝试以下内容:

trait Container {
  type X
}

class Test[C <: Container](val c: C) {
  def foo(x: c.X): C#X = x // this compiles fine
  def bar(x: C#X): c.X = x // this does not compile
}
Run Code Online (Sandbox Code Playgroud)

使用此表单时问题是相同的:

def bar[C <: Container](c: C)(x: C#X): c.X = x
Run Code Online (Sandbox Code Playgroud)

我真的不明白为什么foo编译而bar不是.

我相信,c.XC#X应该是一样的在这里.

另外,我不明白错误信息:

[error]  found   : x.type (with underlying type C#X)
[error]  required: Test.this.c.X
[error]  possible cause: missing arguments for method or constructor
[error]   def …
Run Code Online (Sandbox Code Playgroud)

scala path-dependent-type dependent-method-type

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