首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Scala路径依赖类型:从引用到成员val对象的类型似乎与直接来自原始val对象的类型不同?

Scala路径依赖类型:从引用到成员val对象的类型似乎与直接来自原始val对象的类型不同?
EN

Stack Overflow用户
提问于 2011-12-22 04:56:24
回答 1查看 466关注 0票数 1

我的标题可能没有很好地描述这个问题。我所做的事情不需要这个问题的答案,我现在有了正确的答案,但是当我使用Scala combinator解析器时,我遇到了这个问题,让我感到困惑。我想更好地理解这种语言(我在很大程度上是Scala新手),所以我想看看是否有人能给我解释一下:

代码如下:

代码语言:javascript
运行
复制
package my.example

import scala.io.Source
import scala.util.parsing.input.StreamReader
import scala.util.parsing.combinator.lexical.StdLexical
import scala.util.parsing.combinator.syntactical.StandardTokenParsers

class DummyParser extends StandardTokenParsers
{
    def scan
    (
        filename : String
    ) : Unit =
    {
        // Read in file
        val input = StreamReader( Source.fromFile( filename ).bufferedReader )
        // I want a reference to lexical in StandardTokenParsers
        val mylexical = lexical
        // Even if I put a type above like these two below it does not help
        // val mylexical : StdLexical = lexical
        // val mylexical : Tokens = lexical
        val tokensGood : lexical.Scanner = new lexical.Scanner( input )
        /*
        Compile error in following line:
        error: type mismatch;
        found   : mylexical.Scanner
        required: DummyParser.this.lexical.Scanner
        */
        val tokensBad : lexical.Scanner = new mylexical.Scanner( input )
    }
}

"val tokensBad“行获取注释中显示的编译错误。上面的mylexical不是引用了与this.lexical (上面的类是从其派生的StandardTokenParsers中定义的)完全相同的对象。阅读“Scala编程”,我想我有点理解lexical.Scanner的类型是路径相关的(第20.7节),但是lexical.Scanner和mylexical.Scanner不应该是同一类型吗?lexical和mylexical不是同一个对象吗?见鬼,426页的书中的狗粮示例似乎说来自两只不同狗的SuitableFood类型是相同的,在我上面的例子中是完全相同的对象(我想)。这到底是怎么回事?

EN

Stack Overflow用户

回答已采纳

发布于 2011-12-22 06:04:05

您可能希望编译器将lexical.Scannermylexical.Scanner视为相等,因为在运行时,mylexicallexical的值始终相同。这是一个运行时属性,类型检查器不做任何数据流分析(这太慢了,不切实际)。

因此,您需要通过告诉类型检查器两个值始终相同来帮助类型检查器。您可以通过使用singleton type来完成此操作。单例类型是一种只有一个值的类型,并被写成(在本例中) lexical.type

如果将mylexical的定义更改为:

代码语言:javascript
运行
复制
val mylexical: lexical.type = lexical

你的程序类型检查。

我们刚刚做的是告诉类型检查器,mylexical在运行时只能有一个值,由单例类型给出。

票数 8
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8596235

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档