当我尝试编写 Scala 的compose
函数时,我得到一个编译时错误。
val compose = (a: Double => Double, b: Double => Double) = b(a)
“:1:错误:';' 预期但找到'='。val comp = (a: Double => Double, b: Double => Double) = b(a)"
这个函数是怎么写的?
当我尝试编写 Scala 的compose
函数时,我得到一个编译时错误。
val compose = (a: Double => Double, b: Double => Double) = b(a)
“:1:错误:';' 预期但找到'='。val comp = (a: Double => Double, b: Double => Double) = b(a)"
这个函数是怎么写的?
将最后一个替换=
为=>
. 该=>
符号在值位置时将参数与函数的实现分开。
您声明函数 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 推断器的提示,并且无法声明返回,推断器为我们填充。因此,我怀疑你想要什么。
您需要为编译器提供更多类型信息:
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
很小心。在当前状态下,您的定义有两点错误:
第一个是生成您所看到的异常的那个。您实际上并不希望前面的赋值运算符b(a)
,您希望它成为匿名函数的主体,因此您需要=>
运算符:
val compose = (a: Double => Double, b: Double => Double) => b(a)
但是,您还没有完成。在 bodyb(a)
中,编译器认为你正在做的是apply
ing 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
但那是欺骗。