繁体   English   中英

Scala函数组合

[英]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

它们不带参数,但返回函数,这些函数采用列表并分别调用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))

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

List[T].tailList[T].reverseList[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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM