Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala:围绕“;非法循环引用“;_Scala_Tree_Types - Fatal编程技术网

Scala:围绕“;非法循环引用“;

Scala:围绕“;非法循环引用“;,scala,tree,types,Scala,Tree,Types,我正在尝试实现一个基于HashMap的树,它支持对给定根键进行O(1)子树查找。为了实现这一目标,我正努力做到以下几点: scala> type Q = HashMap[Char, Q] <console>:6: error: illegal cyclic reference involving type Q type Q = HashMap[Char, Q] ^ 非常感谢。我可能不“理解”这个问题,但是你呢

我正在尝试实现一个基于HashMap的树,它支持对给定根键进行O(1)子树查找。为了实现这一目标,我正努力做到以下几点:

scala> type Q = HashMap[Char, Q]
<console>:6: error: illegal cyclic reference involving type Q
       type Q = HashMap[Char, Q]
                          ^
非常感谢。

我可能不“理解”这个问题,但是你呢

class L {
  type Q = java.util.HashMap[Char, this.type]
}


对于不能
扩展的类型
,例如
,也可以使用一个简单的包装器:

class MyEither(get: Either[String, MyEither])
或者,一个带有
的递归树(导致我进入此线程的原因):

哪个类型是此伪代码的合法版本:

type Error = String
type Errors = List[(FieldName, Either[Error, Errors])]

然后,您所有的
Left(…)
Right(…)
调用将分别变成
FieldError(Left(…)
FieldError(Right(…)
),例如
FieldError(Right(x)).get==Right(x)
,您能澄清一下要定义什么样的结构吗?一棵树,它的弧被标记为
Char
,其节点完全不包含任何信息?如果是这样的话,您的
LTree
几乎是最小的,尽管在编写过程中,您只能创建空树,因为
子树
哈希映射
本身一样是不可变的,并且构造函数不带任何参数。谢谢您的评论Randall。我刚刚调整了上面的清单,以表明(在我的源代码中)所使用的HashMap是可变的。该用例实际上是一个有向图,带有char标记的边和节点不包含任何信息。这实际上是一个基本的DFA,叶节点隐式地被视为最终状态。无论如何,上面的内容与scala语法的问题没有多大关系——我想我给出的这个小片段是一个解决方法,我只是想知道是否有一种方法可以像第一个清单中所建议的那样更简洁地完成它,使用
LTree
的第二种方法更合适,因为我可以将字段和成员函数放入其中,用于各种树操作。我们必须承认的一点是,Scala虽然通常比Java简洁得多,但通常仍被Haskell打败。我还应该指出,Scala的
type
声明只为已经存在的类型命名别名,而没有发明新的别名。在这方面,Scala的
类型
与Haskell的
类型
相似,而不是它的
新类型
。在我同意的一些评论中,有一条来自Alex Payne:
在Haskell从事编程语言领域的18年中,它一直扮演着未被充分利用的理论理想替代品的角色。自从研究语言成为我的爱好以来,我已经记不清我看过多少次《也许是哈斯克尔?》。我看到越来越多的程序员开始真正使用Scala,而不是思考它的理论可能性。我觉得这种实用主义令人鼓舞。
谢谢阿泰姆!这两项工作,这正是我想要的。Спасибо! :)你能解释一下第一个吗?
class MyEither(get: Either[String, MyEither])
// represents (validation) errors for a tree structure of nested dictionaries
type FieldName = String
type Error = String

type Errors = List[(FieldName, FieldError)]
case class FieldError(val get: Either[Error, Errors])
type Error = String
type Errors = List[(FieldName, Either[Error, Errors])]