斯卡拉:我在写一个咖喱功能吗?

时间:2017-07-13 17:48:42

标签: scala functional-programming higher-order-functions currying

我必须将以下函数转换为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 }))

问题在于,在我看来,我对使用更高阶函数的问题感到困惑。

任何人,如果我做得对,如果没有,我怎么能设法做到这一点?

1 个答案:

答案 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(这是另一个函数......)到字符串列表的函数。