小编ade*_*rtc的帖子

像树一样的递归数据类型,如Avro模式

阅读https://avro.apache.org/docs/current/spec.html表示模式必须是以下之一:

  • JSON字符串,命名已定义的类型。
  • JSON对象,其形式为: {"type": "typeName" ...attributes...}其中typeName是原始类型名称或派生类型名称,如下所示。允许将本文档中未定义的属性用作元数据,但不得影响序列化数据的格式。
  • JSON数组,表示嵌入式类型的并集。

我想要一个使用树的递归定义来描述树的架构:

  • 具有值(例如整数)和树列表​​(子代)的节点
  • 有值的叶子

我最初的尝试看起来像:

{
  "name": "Tree",
  "type": [
    {
      "name": "Node",
      "type": "record",
      "fields": [
        {
          "name": "value",
          "type": "long"
        },
        {
          "name": "children",
          "type": { "type": "array", "items": "Tree" }
        }
      ]
    },
    {
      "name": "Leaf",
      "type": "record",
      "fields": [
        {
          "name": "value",
          "type": "long"
        }
      ]
    }
  ]
}
Run Code Online (Sandbox Code Playgroud)

但是Avro编译器拒绝此操作,抱怨没有类型{"name":"Tree","type":[{"name":"Node"...。似乎Avro不喜欢顶层的联合类型。我猜测这属于上述规则“架构必须是.. JSON对象..其中typeName是原始类型或派生类型名称之一”。我不确定“派生类型名称”是什么。起初,我认为它与“复杂类型”相同,但其中包括联合类型。

无论如何,将其更改为更复杂的定义:

{
  "name": "Tree",
  "type": "record",
  "fields": [{
    "name": "ctors",
    "type": [ …
Run Code Online (Sandbox Code Playgroud)

protocols recursive-datastructures avro

5
推荐指数
2
解决办法
1244
查看次数

安装Typesafe Stack 2.0时`g8`做了什么

所以,我只是通过安装在类型安全堆栈普遍安装(下载一个.zip和未荏苒到我的/usr/local目录中.我看了看网站,它提到的sbtg8,所以我第一次输入sbt,看看会发生什么,它只是给了我一个关于当前directoy中没有项目的小错误.然后我打字g8并开始下载一堆东西......虽然我不确定是什么.有谁能告诉我?附图片.

另外,Typesafe堆栈是否附带Scala和Akka?该网站似乎说它确实如此,但如果我删除我原来的Scala 2.9路径.bash_profile,然后重新启动终端,它会抱怨它不存在.

G8

scala typesafe-stack

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

使用/不使用断言进行编译时的javap差异

不耐烦的Scala第15章练习10:添加assert(n >= 0factorial方法中.编译启用断言并验证是否factorial(-1)抛出异常.无需断言即可编译.怎么了?使用javap看看发生了什么,以断言通话.

我的代码:

object Test {
  def factorial(x: Int): Int = {
    assert(x >= 0, "Call to factorial must be >= 0!")
    x match {
      case 0 => 1
      case x: Int => x * factorial(x - 1)
    }
  }

  def main(args: Array[String]): Unit = {
    factorial(-1)
  }
}
Run Code Online (Sandbox Code Playgroud)

scalac首先编译,使用检查它javap Test,然后再次编译scalac -Xelide-below MAXIMUM并使用相同的命令进行检查 - 我似乎无法找到两者之间的区别.

我理解使用断言进行编译会在我尝试执行程序时抛出异常,而没有断言的编译会导致堆栈溢出错误,但我找不到javap...

scala javap

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

用于分布式图形处理的Scala与C++

对于最短路径计算等图形的并行处理,Scala会胜过C++吗?如果没有,它会慢多少(我假设Scala并发比C++"更容易"编写,因为C++没有标准支持这些东西)

我正在考虑学习Scala,既要学习一门新语言,也要学习并发支持.一旦我完成了,我正在考虑编写一个分布式图形库来练习Scala,并且供我自己使用,但是如果C++会更快并且更容易编写代码的好处不值得权衡,当性能是关注,我将不得不重新考虑这个任务.

c++ scala graph

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

用HashMap [Int,Vector [Int]](Scala)表示图形(邻接列表)?

我想知道如何(如果可能的话)我可以通过制作(可变)图形的邻接列表表示HashMap[Int, Vector[Int]].HashMap当然是可变的.

目前我把它设置为HashMap[Int, ArrayBuffer[Int]],但事实上我可以改变ArrayBuffer中的每个单元格让我感到不舒服,即使我很确定我不是那样做的.我会使用a ListBuffer[Int]但我希望快速随机访问邻居,因为我需要在图上进行快速随机游走.A Vector[Int]会解决这个问题,但无论如何都要这样做吗?

据我所知(在REPL中尝试过),这不起作用:

scala> val x = new mutable.HashMap[Int, Vector[Int]]
x: scala.collection.mutable.HashMap[Int,Vector[Int]] = Map()

scala> x(3) = Vector(1)

scala> x(3) += 4 // DOES NOT WORK
Run Code Online (Sandbox Code Playgroud)

我需要能够随时附加到它并随机访问其中的任何元素(给定索引).这可能吗?

谢谢!-kstruct

scala graph vector adjacency-list

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

在错误的输入/行为上退出C/C++程序的"正确"方法

快速问题..是否有一种"正确"的方式从无效输入的C/C++程序终止?到目前为止,我在C/C++的职业生涯中涉及到这样的事情:

// C
#include <stdio.h>
int main(int argc, char **argv)
{
    if (argc != 3) {
        fprintf(stderr, "Error: Usage: %s [some param] [some param]\n", argv[0]);
        return 1;
    }

    /* rest of program */

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

在C++中,这可能是cerr代替fprintf(srderr...)iostream代替或stdio.h.

这是一个好的/可接受的方式,还是有一个我不知道的标准?

谢谢!

c c++ exit

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

在Scala中的文件中有效地存储Long序列

所以我有一个关联将一对Ints与一个Vector[Long]最大为10000 的s 相关联,并且我有几十万到一百万这样的数据.我想将它存储在一个文件中,以便以后在Scala中处理.

显然,以纯文本格式存储它会占用太多空间,所以我一直试图通过编写Byte流来弄清楚如何做到这一点.但是我不太确定这是否会起作用,因为在我看来byteValue(),a Long返回Byte仍然是4个字节长的表示,因此我不会保存任何空间?我没有太多使用二进制格式的经验.

似乎Scala标准库有BytePickle可能是我想要的,但后来被弃用了?

byte scala binaryfiles bytearray binary-data

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

sbt(Scala)通过SSH导致找不到命令,但是如果我自己这样做的话会有效

所以我试图做一些涉及运行sbtSSH命令的事情,这就是我正在尝试的事情:

ssh my_username@<server ip> "cd <project folder>; sbt 'run-main Foo' "
Run Code Online (Sandbox Code Playgroud)

但是当我这样做时,我收到一条错误消息: bash: sbt: command not found

然后我自己进入服务器SSH,cd到项目文件夹,然后运行sbt 'run-main Foo',一切运行良好.我已检查以确保通过远程服务器sbt上的$PATH变量ssh my_username@<server ip> "echo $PATH",它显示正确的值.

我觉得这是一个简单的修复,但无法弄清楚...帮助?谢谢!-kstruct

ssh bash scala sbt

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

在多台(集群)计算机上同时运行SBT(Scala)

所以我现在已经和Akka Actors一起玩了一段时间,并编写了一些可以在集群中的多台机器上分配计算的代码.之前我跑了"主"的代码,我需要有一个ActorSystem每一台机器,我会被部署在上等待,而我通常做这个通过Python脚本,SSH的到所有的机器,并开始通过执行类似的过程cd /into/the/proper/folder/,然后sbt 'run-main ActorSystemCode'.

我在其中一台机器上运行这个Python脚本(称之为"机器X"),因此我将在我的Machine X SSH会话中看到SSH输入到所有其他机器的输出.每当我运行脚本时,似乎所有的机器都在重新编译整个代码之前实际运行它,让我在完成任何有用的事情之前坐在那里几分钟.

我的问题是:

  1. 为什么他们需要重新编译?所有机器都可以使用相同的JVM,所以不应该立即运行吗?

  2. 如何解决使每台机器编译"它自己的副本"的问题?

scala sbt actor akka

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

在特征(Scala)的抽象领域 - 建筑顺序

所以我正在为不耐烦的书阅读Scala,它使用的一个例子是一个Logger基本上打印String到某个流的特征.在该实例中,它具有性状ConsoleLogger(延伸Logger),该打印消息出去stdoutShortLogger(也延伸Logger),其简单地截断字符串,如果该长度过长.要改变ShortLogger书籍的最大长度,建议使用匿名子类,如:

val acct = new SavingsAccount with ConsoleLogger with ShortLogger {
  val maxLength = 20
}
Run Code Online (Sandbox Code Playgroud)

ShortLogger具有抽象maxLength: Int字段的特征在哪里SavingsAccount定义为

class SavingsAccount extends Account with Logged { ... }
Run Code Online (Sandbox Code Playgroud)

这对我有意义(有点).我假设施工顺序是:

  1. Logger首先构建(因为它是一个超级特征ConsoleLogger),
  2. ConsoleLogger
  3. ShortLogger
  4. Account
  5. SavingsAccount.
  6. 然后我们有匿名子类构造,我们定义了抽象maxLength = 20.

然而,在本书的后面,它给出了一个新的Logger子特征:

trait FileLogger extends Logger {
  val filename: String
  val out …
Run Code Online (Sandbox Code Playgroud)

inheritance scala multiple-inheritance traits

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