小编Jes*_*har的帖子

Scala中Streams的用例

在Scala中有一个Stream类,它非常像迭代器.主题Scala中Iterator和Stream之间的区别?提供了两者之间相同点和不同点的一些见解.

看看如何使用流非常简单,但我没有很多常见的用例,我会使用流而不是其他工件.

我现在的想法:

  • 如果你需要使用无限系列.但这对我来说似乎不是一个常见的用例,因此它不符合我的标准.(请纠正我,如果这是常见的,我只是有一个盲点)
  • 如果您有一系列数据需要计算每个元素,但您可能需要多次重复使用.这很弱,因为我可以将它加载到一个列表中,这对于大部分开发人员来说在概念上更容易理解.
  • 也许存在大量数据或计算量很大的系列,并且您需要的项目很可能不需要访问所有元素.但是,在这种情况下,除非你需要做一些搜索,在这种情况下,你可以使用一个清单,以及即使是稍微低效率的迭代器将是一个很好的匹配.
  • 有一系列复杂的数据需要重复使用.这里可以再次使用列表.虽然在这种情况下两种情况都同样难以使用,并且Stream更适合,因为并非所有元素都需要加载.但又不是那么常见......或者是这样吗?

所以我错过了任何重大用途吗?或者它是大多数开发人员的偏好?

谢谢

scala stream scala-collections

50
推荐指数
3
解决办法
2万
查看次数

可以在Scala HList上执行Map

我现在已经做了一些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)

scala hlist shapeless

29
推荐指数
2
解决办法
4153
查看次数

Scala中的类型模式不考虑继承?

我在某些情况下使用类型类设计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 …

inheritance scala implicit typeclass

9
推荐指数
2
解决办法
1961
查看次数