[英]Scala Function Composition
def t[A] = (l:List[A]) => l tail
def r[A] = (r:List[A]) => r reverse
def tr[A] :List[A] => List[A] = t compose r
tr(List(1,2,3,4))
清单(3,2,1)
正如所料。
但不知何故,我试过的每个变体(有几种类型的注释)
def tr = tail compose reverse
失败(未找到 - 值尾)。 我错过了一些明显的东西,但我被困住了。
好吧,让我们从后面开始, compose
函数的作用。
它在Function1中定义为def compose[A](g: (A) => T1): (A) => R
,和描述
在新的Function1中组合Function1的两个实例,最后应用此函数。
它做了什么需要另一个函数g
,取一些类型的参数A
,并返回相同的类型T1
。 它创建了新函数,当被调用时等效于调用f(g(x))
。
您定义的两个函数:
def t[A] = (l:List[A]) => l.tail
def r[A] = (r:List[A]) => r.reverse
它们不带参数,但返回函数,这些函数采用列表并分别调用tail
和reverse
参数。
你可以这样写:
def t[A](l: List[A]): List[A] = l.tail
def r[A](l: List[A]): List[A] = l.reverse
所以两个函数的组成是t(r(List(1,2,3,4)))
。
然而, tail
或reverse
不是函数,它们是在List
类中定义的方法。 必须在一个对象上调用它们,并且你无法做tail(reverse(arg))
。
compose
是一个函数(即Function1
)组合。
List[T].tail
和List[T].reverse
是List[T]
方法
在scala中,A => B将被视为Function1,它定义了方法组合,所以如果你想使用tail compose reverse,你需要给scala编译器暗示它是什么“ 类 ”,然后改变一个“ 方法 ”到一个“ 功能 ”。
这个例子 :
def tr[A] = ((x: List[A]) => x.tail) compose ((x: List[A]) => x.reverse)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.