相关疑难解决方法(0)

在方法返回类型上键入推断

当方法中使用显式return语句时,为什么Scala无法推断方法的返回类型?

例如,为什么以下代码编译?

object Main {
    def who = 5
    def main(args: Array[String]) = println(who)
}
Run Code Online (Sandbox Code Playgroud)

但以下情况并非如此.

object Main {
    def who = return 5
    def main(args: Array[String]) = println(who)
}
Run Code Online (Sandbox Code Playgroud)

scala type-inference

28
推荐指数
2
解决办法
6353
查看次数

是否可以扩展Scala编译器以推断返回类型的递归方法?

Scala编译器当前无法推断递归方法的返回类型,如以下代码所示

def foo(i:Int) = if (i > 0) foo (i-1) else 0
Run Code Online (Sandbox Code Playgroud)

上述声明中是否存在任何矛盾?(即,除了Int可能以外的任何类型?)

我可以想象,在更复杂的例子中,很难推断出类型.

是否有可能进一步描述递归方法的情况,我们可以(不)推断出类型?

[编辑:]编译器足够聪明,可以发现这String是不正确的.

scala> def foo(i:Int):String = if (i > 0) foo (i-1) else 0
<console>:5: error: type mismatch;
found   : Int(0)
required: String
Run Code Online (Sandbox Code Playgroud)

scala

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

Scala Play Framework模板中的递归块

我正在为博客文章编写一个模板,该文章有线程评论.一种为线程注释编写模板的自然方法,它使用递归方式构造Html.像这样的东西:

@showComment(comment: models.Comment) = {
    <div class="comment">
        <div class="comment-metadata">
            <span class="comment-author">by @comment.author,</span>
            <span class="comment-date">
                @comment.postedAt.format("dd MMM yy")
            </span>
        </div>
        <div class="comment-content">
            <div class="about">Detail: </div>
            @Html(comment.content.replace("\n", "<br>"))
        </div>
        <a href="@action(controllers.Application.replyComment(comment.id()))">Reply</a>
        @comments filter { c => c.parent_id == comment.id } map { 
            c => @showComment(c)
        }
    </div>
}
Run Code Online (Sandbox Code Playgroud)

问题是使用递归块会产生错误:

引发的错误是:递归方法showComment需要结果类型

如果我尝试在showComment中放置一个返回类型,它会引发这个错误:

引发的错误是:找不到:值showComment

任何解决方法?

scala threaded-comments playframework

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

Scala案例类和列表

我对Scala完全不熟悉.现在我正在尝试将我在Standard ML中编写的解析器移植到Scala并遇到以下代码的问题:

abstract class Token
case class Zero extends Token
case class At extends Token
//...

object Tokenizer {
  def tokenize(seq : List[Char]) : List[Token] = seq match {
    case List() => error("Empty input")
    case '0' :: rest => Zero :: tokenize(rest)
    case '@' :: rest => At :: tokenize(rest)
    //...
  }  
}
Run Code Online (Sandbox Code Playgroud)

在SML中,我不必声明tokenize()方法的返回类型,但似乎Scala需要它,并且它对我提供的类型不满意(它抱怨Zero,At是无效类型,它们应该是代替Token类型).请注意,我还想在解析阶段稍后的时间点匹配令牌列表.

我在网上和stackoverflow本身做了一些搜索,看看之前是否提出了类似的问题(看起来很简单),但不知怎的,我找不到任何东西.我很确定我有一些基本错误,请随时赐教:)

scala type-inference list case-class

4
推荐指数
2
解决办法
1200
查看次数