我想知道为什么会出现编译错误,以及如何纠正错误:
<form action="https://reel-guiding-development.s3.amazonaws.com" method="post" enctype="multipart/form-data">
<input type="hidden" name="key" value="[redacted]" />
<input type="hidden" name="success_action_status" value="201" />
<input type="hidden" name="acl" value="public-read" />
<input type="hidden" name="policy" value="[redacted]=" />
<input type="hidden" name="x-amz-credential" value="[redacted]" />
<input type="hidden" name="x-amz-algorithm" value="AWS4-HMAC-SHA256" />
<input type="hidden" name="x-amz-date" value="20160226T143447Z" />
<input type="hidden" name="x-amz-signature" value="dfe48736cdf600f90181019792835c991df089a4c8c1942fe40c8ed1fa11a80e" />
<input type="file" name="file" />
<input type="submit" />
</form>
Scala工作台工作表抱怨for循环属于def stripVowelsRecursive(str: String): Char = {
if(str.length() == 0) ' '
else
for(ch <- str) {
if(isVowel(ch)) ch
else ' ' +stripVowelsRecursive(str.tail)
}
}
类型,而它期望Unit
。
Char
语句的两个分支都返回一个Char:
if
答案 0 :(得分:1)
代码中的麻烦:
yield
for
a + b
如果{\ 1}}和a
都是字符,则结果是Java \ Scala中的b
,而不是连接字符串Int
中混合显式for
循环和递归,您必须选择一个可能的解决方案:
else
答案 1 :(得分:1)
我想我知道你在做什么。问题是你试图循环你的算法,而不是让递归为你做循环。看看这个:
def stripVowelsRecursive(str: String): String = {
if (str.length == 0) ""
else {
if (isVowel(str.head)) " " + stripVowelsRecursive(str.tail)
else str.head.toString + stripVowelsRecursive(str.tail)
}
}
Char
更改为String
,以便您可以使用字符串的tail
递归调用该函数。head
并将递归应用于其tail
。答案 2 :(得分:-1)
这是因为你的其他人不会返回一个字符,而是一个Unit
。返回类型为Unit
的方法类似于声明为void
的Java方法。 if
和else
都返回字符,但for
循环没有,这就是你的问题。除此之外,您的else
广告正在返回String
而不是Char
,因为String.tail
会返回String
和Char + String
结果String
1}}。
使用递归的正确解决方案是:
def stripVowelsRecursive(str: String): String = {
if (str.length() == 0) str
else {
val head: Char = str.head
val tail: String = str.tail
if(isVowel(head)) stripVowelsRecursive(tail)
else head + stripVowelsRecursive(tail)
}
}
第二个示例(yield
)有效,因为它是sequence comprehensions,而yield
块负责返回值,而不是for
或if
。