当我尝试编写Scala的compose
函数时,出现编译时错误。
val compose = (a: Double => Double, b: Double => Double) = b(a)
“:1:错误:';'预期但发现'='。 val comp =(a:Double => Double,b:Double => Double)= b(a)“
这个函数怎么写的?
答案 0 :(得分: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
答案 1 :(得分: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推理器的提示,并且无法声明返回,推文者为我们填充。因此,我怀疑你想要什么。
答案 2 :(得分:0)
非常仔细。您的定义在当前状态中存在两个问题:
第一个是生成您所看到的异常的那个。您实际上不希望在b(a)
之前使用赋值运算符,您希望它是匿名函数的主体,因此您需要=>
运算符:
val compose = (a: Double => Double, b: Double => Double) => b(a)
然而,你还没有完成。在正文b(a)
中,编译器认为你正在做的是apply
b,a
作为参数,所以你得到:
<console>:7: error: type mismatch;
found : Double => Double
required: Double
val compose = (a: Double => Double, b: Double => Double) => b(a)
正如您所看到的那样,期望b
取Double
,但您将a
作为参数传递,这是Double => Double
/ {{1 }}]。
这就是为什么你看到你正在看到的东西,以及你在下一步中看到的东西,但我不完全确定自己如何回答如何来写{ {1}}。您可以通过向Function1[Double, Double
添加参数来作弊:
compose
但这是作弊。