我必须将以下函数转换为curried函数:
def findAllUsed(t: List[Task]): List[String] = {
t.flatMap(x => x.resources.map(x => x.FIELD_TO_SEARCH)).distinct
}
所以我这样做了:
def findAllUsed(t: List[Task], f: Resource => String): List[String] = {
t.flatMap(x => x.resources.map(f)).distinct
}
findAllUsed(taskSchedules, ((x: Resource) => { x.id }))
findAllUsed(taskSchedules, ((x: Resource) => { x.kind }))
问题在于,在我看来,我对使用更高阶函数的问题感到困惑。
任何人,如果我做得对,如果没有,我怎么能设法做到这一点?
答案 0 :(得分:1)
我假设练习意味着这样的事情:
// separate into two argument lists
def findAllUsed(t: List[Task])(f: Resource => String): List[String] = {
t.flatMap(x => x.resources.map(f)).distinct
}
// apply the first argument list once,
// getting a curried function as a result
val curried = findAllUsed(taskSchedules)
// now you can use it twice with different inputs for the second argument list:
curried(x => x.id)
curried(x => x.kind)
这里的好处(如果有的话)是删除通过taskSchedules
到您的函数的复制:因为它有"它自己的"参数列表,你可以传递一次,将结果分配给一个值(curried
),然后一遍又一遍地重复使用它;
P.S。 curried
的类型为(Resource => String) => List[String]
- 它是Resource => String
(这是另一个函数......)到字符串列表的函数。