【发布时间】:2013-10-04 15:21:45
【问题描述】:
我有什么
我下面有一个函数(我不能改变外部函数)
def outer(x: Int, inner: Int => Boolean): Boolean = {
inner(x)
false
}
我想要什么
定义 inner 函数的方式是: if (x == 10) outer function return true
def inner(x: Int): Boolean = {
if (x == 10) OUTER_FUNCTION_SHOULD_RETURN_TRUE!!!
else false
}
outer(10, inner) // TRUE!!
问题
我该怎么做?
编辑:
我使用下一个技巧:
// If inner return true at least once, then outerWraper return true
def outerWrapper(x: Int, inner: Int => Boolean): Boolean = {
var flag = false
def inner2(e: Int): Boolean = {
if (!flag) flag = inner(e)
inner(e)
}
outer(x, p2)
flag
}
我可以避免使用 var 标志,而是使用 val insted 吗?据我了解 var 在 Scala 中是一种不好的风格
【问题讨论】:
-
据我所知,如果不更改
outer函数,您将无法做到这一点! -
还有,不应该是
outer(10,inner) // TRUE!!吗? -
首先,这看起来像是 Coursera 课程的家庭作业,因此不适合为您提供完整的解决方案。也就是说,作为编写
exists的提示(如果我正确理解这个问题,最终你会遇到什么问题):不要重复使用forall- 你只需要检查集合中的条目,直到找到匹配项,所以编写一个尾递归内部方法,以这种方式工作。 -
进一步提示:假设您正在寻找偶数 - 如果集合中没有偶数,那么集合的所有元素必须是什么?您应该会发现,
exists的最简单解决方案实际上是单线。 -
另外,可以在函数内部使用 vars。您只是不想将它们泄漏到函数或类的外部。您只需要确保您了解应用程序的其余部分是否存在泄漏。仅在本地和需要时使用 mutable。
标签: scala