在Scala中有一个Stream类,它非常像迭代器.主题Scala中Iterator和Stream之间的区别?提供了两者之间相同点和不同点的一些见解.
看看如何使用流非常简单,但我没有很多常见的用例,我会使用流而不是其他工件.
我现在的想法:
所以我错过了任何重大用途吗?或者它是大多数开发人员的偏好?
谢谢
我现在已经做了一些HList的实现.一个基于丹尼尔斯皮瓦克在斯卡拉之地的高级巫术讲话,另一个基于Apocalisp博客中的帖子.目标是有一个异类列表,其中主要类型不是异质的,而是更高类型.例如:
val requests = Request[String] :: Request[Int] :: HNil
Run Code Online (Sandbox Code Playgroud)
我可以在列表中执行映射来执行请求,并生成更高类型的异构列表.所以:
requests.map(execute)
Run Code Online (Sandbox Code Playgroud)
应该相等
String :: Int :: HNil
Run Code Online (Sandbox Code Playgroud)
可悲的是,我的所有尝试都产生了任何HList.以下是最近尝试的代码:
class Request[+Out](o:Out) {
type O = Out
def v:O = o
}
object HList {
trait Func[-Elem,Out] {
type Apply[E <: Elem] <: Out
def apply[N <: Elem](e:N):Apply[N]
}
sealed trait HList[Base] {
type Head <: Base
type Tail <: HList[Base]
type Map[Out,F <: Func[Base,Out]] <: HList[Out]
def head:Head
def tail:Tail
def ::[A <: Base](a:A):HList[Base]
def map[Out,F <: Func[Base,Out]](f:F):Map[Out,F]
}
case class …Run Code Online (Sandbox Code Playgroud) 我在某些情况下使用类型类设计API但是我遇到了隐式解析的问题.如下所示,如果存在类型A的隐式对象但是将类型的对象B extends A传递给该方法,则无法找到隐式对象.有没有办法使这项工作或调用者必须将隐式对象放入每个子类的范围?
这是一个例子:
class A
class B extends A
class T[+X]
object T {
implicit object TA extends T[A]
}
def call[X:T](x:X) = println(x)
// compiles
call(new A)
// doesn't compile
call(new B)
var a = new A
// compiles
call(a)
a = new B
// compiles
call(a)
val b = new B
// doesn't compile
call(b)
Run Code Online (Sandbox Code Playgroud)
无法使用以下输出进行编译:
/private/tmp/tc.scala:16: error: could not find implicit value for evidence parameter of type this.T[this.B]
call(new B)
^
/private/tmp/tc.scala:28: error: could …