小编anc*_*ite的帖子

使用scala中的解析器组合器创建递归数据结构

我是scala的初学者,在S99上尝试学习scala.其中一个问题涉及从字符串转换为树数据结构.我可以"手动"完成它,我也想看看如何使用Scala的解析器组合器库来实现它.

树的数据结构是

sealed abstract class Tree[+T]
case class Node[+T](value: T, left: Tree[T], right: Tree[T]) extends Tree[T] {
  override def toString = "T(" + value.toString + " " + left.toString + " " + right.toString + ")"
}
case object End extends Tree[Nothing] {
  override def toString = "."
}
object Node {
  def apply[T](value: T): Node[T] = Node(value, End, End)
}    
Run Code Online (Sandbox Code Playgroud)

输入应该是一个字符串,如下所示: a(b(d,e),c(,f(g,)))

我可以用类似的东西来解析字符串

trait Tree extends JavaTokenParsers{
  def leaf: Parser[Any] = ident
  def child: Parser[Any] = node …
Run Code Online (Sandbox Code Playgroud)

tree parsing scala parser-combinators

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

类Foo {this:SomeTraitType =>是什么意思?

我有这个基于Akka Concurrency预打印的问题(最终版本还没有),使用它时没有解释.

在课程的第1版中,他们有:

class Altimeter extends Actor with ActorLogging with EventSource{
...
}
Run Code Online (Sandbox Code Playgroud)

声称Altimeter现在与EventSource紧密结合,因此测试Altimeter还需要测试EventSource.修复建议的更改如下:

--- a/src/main/scala/Altimeter.scala
+++ b/src/main/scala/Altimeter.scala
@@ -9,9 +9,10 @@ import  scala.concurrent.ExecutionContext.Implicits.global
 object Altimeter{
   case class RateChange(amount: Float) //sent to Altimeter
   case class AltitudeUpdate(altitude: Double)
+  def apply() = new Altimeter with ProductionEventSource
 }

-class Altimeter extends Actor with ActorLogging with EventSource{
+class Altimeter extends Actor with ActorLogging{ this: EventSource =>
   import Altimeter._

   val ceiling = 43000       //feet
diff --git a/src/main/scala/EventSource.scala b/src/main/scala/EventSource.scala
index 1fd5578..ded4f38 100755
--- a/src/main/scala/EventSource.scala
+++ …
Run Code Online (Sandbox Code Playgroud)

oop scala traits

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

标签 统计

scala ×2

oop ×1

parser-combinators ×1

parsing ×1

traits ×1

tree ×1