在scala方法中寻址参数函数的参数

时间:2017-11-25 22:40:49

标签: scala

这可能是显而易见的,但它让我发疯,我认为我的代码因此而变得臃肿(错过了显而易见的,而不是让我疯狂的部分) 。

我有一个方法如下:

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

3 个答案:

答案 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