这可能是显而易见的,但它让我发疯,我认为我的代码因此而变得臃肿(错过了显而易见的,而不是让我疯狂的部分) 。
我有一个方法如下:
def fun(f: Int => Boolean, y: Int): Int
这个方法将被调用为fun(*some anon func*, y)
,当某个函数(应用于某个参数)大于0且y - 1时,该方法应该增加并返回y + 1除此以外。如何定义fun
?我正在尝试像
def fun(f: Int => Boolean, y: Int): Int =
if (f) y - 1
else y + 1
显然,这不起作用。我应该f(tmp)
,tmp:Int
,但我现在确定如何表达。
我在网上找到的所有示例始终在f
上应用y
,但这很有趣。
更新:这是我已经解决过的类似问题,但我对我是怎么做的不满意:
对于给定的函数forall(s: Set, p: Int => Boolean): Boolean
,如果 S (def S: int => Boolean
中的所有设置元素 x ,则返回true,指标函数对于集合S)满足p(x)
,创建一个将实现 存在 量词(exists
函数)的函数。在集合论中,人们可以将这个量词表达为(就上述问题而言)并非所有元素(不是forall)都满足NOT p 。
我做了类似的事情:
def exists(s: Set, p: Int => Boolean): Boolean = {
def negP(x: Int): Boolean = !p(x)
!forall(s, negP)
}
我的问题是:如何在不定义negP
的情况下执行此操作?我无法声明!p
,因为Scala为!
运算符提供了错误。我无法使用!p(x)
,因为没有x
。因此上面的问题和我的问题。
TIA
答案 0 :(得分:1)
你可以让它返回一个执行该操作的函数,如下所示:
def fun(f: Int => Int, y: Int): Int => Int =
input => if (f(input) > 0) y - 1 else y + 1
val test1 = fun(x => x*2, 1)
println(test1(-1)) // "2"
val test2 = fun(x => x - 100, 5)
println(test2(101)) // "4"
val test3 = fun(x => x, -10)
println(test3(0)) // "-9"
编辑:请注意,我更改了输入函数的签名,因为我认为它可能更好地反映了需求,将其更改回布尔值应该是微不足道的(请参阅其他答案)。 :)
EDIT(2): 看到你更新了你的问题,我认为最好更新我的答案:你总是可以内联一个函数,在你的例子中,也许你可以这样做:
def exists(s: Set, p: Int => Boolean): Boolean = !forall(s, x => !p(x))
答案 1 :(得分:1)
您的原始问题无法解决,因为您无法在不调用f()
的情况下测试f()
的输出,并且如果没有输入参数传递,则无法调用f()
。我认为你能想到的最好的就是这样。
def fun(f: Int => Boolean, y: Int): Int => Int = (arg: Int) =>
if (f(arg)) y - 1
else y + 1
你的“类似问题”在我看来应该是一个不同的问题。
您提出的解决方案可以通过递归来解决,但使用forall()
可以更简洁地表达。
def exists(s: Set[Int], p: Int => Boolean): Boolean =
!forall(s, (x:Int) => !p(x))
答案 2 :(得分:0)
听起来你实际上并不想将参数传递给你的匿名函数?然后试试这个:
def fun(f: () => Boolean, y: Int): Int =
if (f()) y - 1
else y + 1