从头开始编写Scala的Compose

时间:2013-07-23 03:12:01

标签: scala

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

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

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

这个函数怎么写的?

3 个答案:

答案 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)

正如您所看到的那样,期望bDouble,但您将a作为参数传递,这是Double => Double / {{1 }}]。

这就是为什么你看到你正在看到的东西,以及你在下一步中看到的东西,但我不完全确定自己如何回答如何来写{ {1}}。您可以通过向Function1[Double, Double添加参数来作弊:

compose

但这是作弊。