当我尝试编写Scala的compose
函数时,出现编译时错误。从头开始编写Scala的编写
val compose = (a: Double => Double, b: Double => Double) = b(a)
“:1:错误: ';'预期但'='找到 val comp =(a:Double => Double,b:Double => Double)= b(a)“
如何写入此函数?
当我尝试编写Scala的compose
函数时,出现编译时错误。从头开始编写Scala的编写
val compose = (a: Double => Double, b: Double => Double) = b(a)
“:1:错误: ';'预期但'='找到 val comp =(a:Double => Double,b:Double => Double)= b(a)“
如何写入此函数?
非常仔细。在当前状态下,您的定义有两个错误:
第一个是产生您所看到的异常的那个。其实你不希望前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
/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
但这种情况作弊。
你需要给编译器更多类型的信息:
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
与=>
将最后=
。 =>
符号在处于值位置时将参数从函数的实现中分离出来。
您声明了组成函数的作用,但不声明它返回的内容。所以我不确定你想要什么。这里有两种可能性。
您可能希望应用到一个值组成的结果,在这种情况下,它需要的值:
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>
注意到我们一个函数2,而不是功能3和第一组参数后返回的是一个又一个功能。
我们能做到这一点有点不同:
val compose: (Double => Double, Double => Double) => Double => Double =
(a,b) => { x => b(a(x)) }
一个问题在这里的是,=>
的类型位置的使用比其在价值立场的使用略有不同。在一个值的位置,它必须有参数名称和这些参数中的类型注释是Scala推理器的提示,并且返回不能被声明,推理器会为我们填充。因此,我怀疑你想要什么。