当方法中使用显式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编译器当前无法推断递归方法的返回类型,如以下代码所示
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) 我正在为博客文章编写一个模板,该文章有线程评论.一种为线程注释编写模板的自然方法,它使用递归方式构造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完全不熟悉.现在我正在尝试将我在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本身做了一些搜索,看看之前是否提出了类似的问题(看起来很简单),但不知怎的,我找不到任何东西.我很确定我有一些基本错误,请随时赐教:)