我有一些麻烦让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,但已失去了信息x是Bar#X.如果我注释类型,它工作正常:
baz[Bar](x)
Run Code Online (Sandbox Code Playgroud)
有没有办法让Scala推断出正确的类型参数baz?
如果没有,那么一般的答案是什么让它变得不可能?
我遇到了一个我无法解释的问题......在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) 我试图理解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)
有人可以解释如何List与Applicative?进行交互?最后,我希望能够实现其他实例Traverse.
我正在尝试编写以下函数
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) 在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为来自单例类型的路径依赖类型找到正确的类型.
首先,这是示例的类型容器,以及一个实例:
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
我正在使用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.X和C#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 ×7
scalaz ×2
applicative ×1
cats-effect ×1
polymorphism ×1
sbt ×1
scala-cats ×1
scalatest ×1
specs2 ×1
traversal ×1
typeclass ×1