2013-07-23 91 views
1

当我尝试编写Scala的compose函数时,出现编译时错误。从头开始编写Scala的编写

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

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

如何写入此函数?

回答

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/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 

但这种情况作弊。

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 
2

=>将最后==>符号在处于值位置时将参数从函数的实现中分离出来。

您声明了组成函数的作用,但不声明它返回的内容。所以我不确定你想要什么。这里有两种可能性。

您可能希望应用到一个值组成的结果,在这种情况下,它需要的值:

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推理器的提示,并且返回不能被声明,推理器会为我们填充。因此,我怀疑你想要什么。