Scala函数组合

时间:2014-05-11 22:21:45

标签: scala function

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

失败(未找到 - 值尾)。我错过了一些明显的东西,但我被困住了。

3 个答案:

答案 0 :(得分:9)

让我们从后面开始,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

它们不带参数,但返回带有列表的函数,并分别对参数调用tailreverse

你可以这样写:

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

tailreverse不是函数,它们是在List类中定义的方法。必须在一个对象上调用它们,并且你无法做tail(reverse(arg))

答案 1 :(得分:2)

compose是一个函数(即Function1)组合。

List[T].tailList[T].reverseList[T] 方法

答案 2 :(得分:1)

在scala中,<=>,A =&gt; B将被视为Function1,它定义了方法compose,所以如果你想使用tail compose reverse,你需要给scala编译器暗示什么&#34; class &#34;它是,然后更改&#34; 方法&#34;到&#34; 功能&#34;。

示例:

def tr[A] = ((x: List[A]) => x.tail) compose ((x: List[A]) => x.reverse)