1

当我尝试编写 Scala 的compose函数时,我得到一个编译时错误。

val compose = (a: Double => Double, b: Double => Double) = b(a)

“:1:错误:';' 预期但找到'='。val comp = (a: Double => Double, b: Double => Double) = b(a)"

这个函数是怎么写的?

4

3 回答 3

2

将最后一个替换==>. 该=>符号在值位置时将参数与函数的实现分开。

您声明函数 compose 需要什么,但不声明它返回什么。所以我不确定你想要什么。这里有两种可能。

您可能希望将组合结果应用于一个值,在这种情况下,它需要该值:

scala> val compose = (a: Double => Double, b: Double => Double, arg:Double) => b(a(arg))
compose: (Double => Double, Double => Double, Double) => Double = <function3>

它需要两个函数,组合它们并应用arg.

您可能还希望由两个函数组合产生的函数:

scala> val compose = (a: Double => Double, b: Double => Double) => 
  { x:Double =>b(a(x)) }
compose: (Double => Double, Double => Double) => Double => Double = <function2>

现在请注意,我们有一个 Function2,而不是 Function3,并且在第一组参数之后的返回是另一个函数。

我们可以做一些不同的事情:

val compose: (Double => Double, Double => Double) => Double => Double = 
  (a,b) => { x => b(a(x)) }

这里的问题之一是=>在类型位置中的使用与在值位置中的使用略有不同。在位置的值中,它必须具有参数名称,并且这些参数中的类型注释是 Scala 推断器的提示,并且无法声明返回,推断器为我们填充。因此,我怀疑你想要什么。

于 2013-07-23T03:44:32.177 回答
2

您需要为编译器提供更多类型信息:

val compose: (Double => Double, Double => Double) => (Double => Double) = (a, b) => (x => b(a(x)))

scala> val dd1: Double => Double = x => x + x
dd1: Double => Double = <function1>

scala> val dd2: Double => Double = x => x * x
dd2: Double => Double = <function1>

scala> val DD1 = compose(dd1, dd2)
DD1: Double => Double = <function1>

scala> val DD2 = compose(dd2, dd1)
DD2: Double => Double = <function1>

scala> DD1(2)
res0: Double = 16.0

scala> DD2(2)
res1: Double = 8.0
于 2013-07-23T03:41:06.040 回答
0

很小心。在当前状态下,您的定义有两点错误:

第一个是生成您所看到的异常的那个。您实际上并不希望前面的赋值运算符b(a),您希望它成为匿名函数的主体,因此您需要=>运算符:

val compose = (a: Double => Double, b: Double => Double) => b(a)

但是,您还没有完成。在 bodyb(a)中,编译器认为你正在做的是applying b,a作为参数,所以你得到:

<console>:7: error: type mismatch;
 found   : Double => Double
 required: Double
     val compose = (a: Double => Double, b: Double => Double) => b(a)

如您所见,它期望b采用 a Double,但您将a其作为参数传递,即Double => Double/ Function1[Double, Double]。

所以这就是为什么你看到你所看到的,以及你在下一步中看到的,但我自己并不完全确定如何回答相当如何写作compose。你可以通过添加一个参数来作弊compose

scala> val compose = (a: Double => Double, b: Double => Double, c: Double) => b(a(c));
compose: (Double => Double, Double => Double, Double) => Double = <function3>

scala> compose(x => x * 2, y => y * 2, 2)
res2: Double = 8.0

但那是欺骗。

于 2013-07-23T03:31:38.863 回答