Scala中的函数参数,编写折叠

时间:2013-05-08 07:45:59

标签: scala functional-programming

只是好奇定义的以下部分之间有什么区别

abstract class OperationTree {
  def foldOT[T] (flr : (OT, OT) => T, fsv : (Number => T), fs : (String => T), a : OT) : T =
    a match {
      case SimpleValue(v) => fsv(v)
      case SimpleString(s) => fs(s)
      case SimpleOperation(lot, rot, bop) => flr(foldOT[T](flr,fsv,fs,lot) , foldOT[T](flr,fsv,fs,rot))
    }
 }

上面的代码是正确的(我希望!!)。但是当我第一次写它时,def部分是不同的

  def foldOT[T] (flr : (OT, OT => T), fsv : (Number => T), fs : (String => T), a : OT) : T =

并且根据这个定义,我得到了错误(OT,OT => T不带参数)不带参数。

我想知道flr :( OT,OT => T)真的意味着,

我接受关于OT类是否适合放置折叠的建议。 (无论如何我现在将它移动到包装对象)

谢谢!

1 个答案:

答案 0 :(得分:4)

(OT, OT => T)表示Tuple2[OT, Function1[OT, T]]

即。 (T1, T2)T1OTT2OT => T

一般来说,(T1, T2, T3, ..., TN)类型是arity N元组(即N个元素)。

相反,如果你想编写函数,相应的类型是:

(T1, T2, T3, ..., TN) => R

对应N个参数的函数对象,结果为R

FunctionN[-T1, -T2,..., -TN, +R]