寻址参数函数';scala方法中的s参数

寻址参数函数';scala方法中的s参数,scala,Scala,这可能是显而易见的,但它让我发疯,我认为我的代码因此变得臃肿(忽略了显而易见的部分,而不是让我发疯的部分) 我有一个方法如下: def fun(f: Int => Boolean, y: Int): Int 此方法的调用方式如下:fun(*some anon func*,y),当某个anon函数(应用于某个参数)大于0时,应增加并返回y+1,否则返回y-1。如何定义乐趣?我在尝试类似的东西 def fun(f: Int => Boolean, y: Int): Int =

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

我有一个方法如下:

def fun(f: Int => Boolean, y: Int): Int 
此方法的调用方式如下:
fun(*some anon func*,y)
,当某个anon函数(应用于某个参数)大于0时,应增加并返回y+1,否则返回y-1。如何定义乐趣?我在尝试类似的东西

def fun(f: Int => Boolean, y: Int): Int = 
  if (f) y - 1
  else y + 1
显然,这是行不通的。我应该把
f(tmp)
,其中
tmp:Int
,但我现在知道如何表达它了

我在网上找到的所有例子都适用于
y
上的
f
,但这很有趣

更新:这里有一个类似的问题我已经解决了,但我不满意我是如何解决的

对于给定的函数
For all(s:Set,p:Int=>Boolean):Boolean
,如果s中的所有集合元素x
def s:Int=>Boolean
,集合s的指示函数)满足
p(x)
,则返回true,创建一个将实现exists量词的函数(
存在
函数)。在集合论中,我们可以将这个量词表示为(根据上面描述的问题)不是集合的所有元素(不是全部)都满足p

我是这样做的:

def exists(s: Set, p: Int => Boolean): Boolean = {
  def negP(x: Int): Boolean = !p(x)
  !forall(s, negP)
}
def exists(s: Set, p: Int => Boolean): Boolean = !forall(s, x => !p(x))
我的问题是:如何在不定义
negP
的情况下实现这一点?我无法声明
!p
,因为Scala为
运算符提供了错误。我无法使用
!p(x)
,因为没有
x
。因此出现了上述问题和我的问题


TIA

听起来您实际上不想将参数传递给匿名函数?然后尝试以下操作:

def fun(f: () => Boolean, y: Int): Int = 
  if (f()) y - 1
  else y + 1

听起来您实际上不想将参数传递给匿名函数?请尝试以下操作:

def fun(f: () => Boolean, y: Int): Int = 
  if (f()) y - 1
  else y + 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"
编辑:请注意,我更改了输入函数的签名,因为我认为它可能更好地反映了需求,将其更改回布尔值应该很简单(请参见其他答案)。:)

编辑(2): 看到你更新了你的问题,我想最好更新我的答案:你总是可以内联一个函数,在你的例子中,也许你可以这样做:

def exists(s: Set, p: Int => Boolean): Boolean = {
  def negP(x: Int): Boolean = !p(x)
  !forall(s, negP)
}
def exists(s: Set, p: Int => Boolean): Boolean = !forall(s, x => !p(x))

您可以让它返回这样一个函数,如下所示:

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"
编辑:请注意,我更改了输入函数的签名,因为我认为它可能更好地反映了需求,将其更改回布尔值应该很简单(请参见其他答案)。:)

编辑(2): 看到你更新了你的问题,我想最好更新我的答案:你总是可以内联一个函数,在你的例子中,也许你可以这样做:

def exists(s: Set, p: Int => Boolean): Boolean = {
  def negP(x: Int): Boolean = !p(x)
  !forall(s, negP)
}
def exists(s: Set, p: Int => Boolean): Boolean = !forall(s, x => !p(x))

您的原始问题无法解决,因为如果不调用
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))

您的原始问题无法解决,因为如果不调用
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))


关于
anon函数大于0
-
f:Int=>Boolean
无法与
0:Int
进行比较,因此您可能应该明确您的目标。函数f:Int参数是什么?如果已经提供了该值,则不应使用parameter@dveim对问题稍加修改。基本上,如果我通过
(x:Int)=>x*x
,那么无论发生什么情况,
y
都会上升。然而,当我通过
(x:Int)=>x-2
,它将得到不同的x2结果。感觉上你不知道你想做什么,而不是不知道如何做it@hummingBird我更新了我的答案,希望它能起作用。:)关于
anon函数大于0
-
f:Int=>Boolean
无法与
0:Int
进行比较,因此您可能应该明确您的目标。函数f:Int参数是什么?如果已经提供了该值,则不应使用parameter@dveim对问题稍加修改。基本上,如果我通过
(x:Int)=>x*x
,那么无论发生什么情况,
y
都会上升。然而,当我通过
(x:Int)=>x-2
,它将得到不同的x2结果。感觉上你不知道你想做什么,而不是不知道如何做it@hummingBird我更新了我的答案,希望它能起作用。:)虽然OP没有把他们想要的东西说得很清楚,但看起来它可能是正确的answer@Dici,你说得很清楚,你讨厌别人解释得不好。我所做的只是举个例子,并尽我所能解释。第一次学习scala和函数式编程,某些概念让我头疼,因为我不知道如何解决这个问题。为了帮助你-不,这并不能解决我的问题。Thx用于trying@raudbjorn,不幸的是,这没有帮助,因为函数签名已更改。Thx和抱歉在解释中出现问题。如果有帮助的话,我让Dici抱怨我在解释时遇到的问题,并分享一些痛苦:)@hummingBird hum?希望它没有那么咄咄逼人,我不是特别批评你的问题,只是说我不确定确切的要求是什么