scala - 使用地图的 Scala 中的 zipWith
问题描述
定义 zipWith。它应该压缩两个列表,但不是将元素压缩成一个元组,它应该使用一个函数来组合两个元素。
示例: zipWith(List(1, 2, 3), List(10, 11, 12), (x: Int, y: Int) => x+y) 应该返回: List(11,13,15)
使用地图和邮编。
def zipWith[A,B,C](xs: List[A], ys: List[B], f: (A, B) => C): List[C] = {
val zs = xs.zip(ys)
//I don't know how to do this because if myMap(zs, f)
//myMap takes a functin f:(a)=>b instead of f: (A, B) => C
}
}
解决方案
听起来你在寻找这样的东西:
def zipWith[A,B,C](xs: List[A], ys: List[B], f: (A, B) => C): List[C] = {
(xs, ys) match {
case (Nil, _) => Nil
case (_, Nil) => Nil
case (x :: xs, y :: ys) => f(x, y) :: zipWith(xs, ys, f)
}
}
希望有帮助。
更新
这是相同的函数,但是是尾递归的:
def zipWith[A, B, C](xs: List[A], ys: List[B], f: (A, B) => C): List[C] = {
@tailrec
def zipAccumulatingResult(xs: List[A], ys: List[B], f: (A, B) => C, acc: List[C]): List[C] = {
(xs, ys) match {
case (Nil, _) => acc
case (_, Nil) => acc
case (x :: xs, y :: ys) => zipAccumulatingResult(xs, ys, f, acc :+ f(x, y))
}
}
zipAccumulatingResult(xs, ys, f, Nil)
}
推荐阅读
- sql-server - 自动将存储过程从 SQL Server 迁移到 Postgres
- c++ - 是否可以将函数引用保留到 unordered_map 或向量中?
- firebase - 哪个更安全 - 使用 Firebase auth.createUserWithEmailAndPassword() 还是使用云功能?
- python - 检查 DataFrame 中的前导零
- woocommerce - 在 Woocommerce 中删除订单摘要页面上的摘要
- python - 如何从字典值中提取字符串
- npm - 是否可以让 npm 从本地文件获取依赖项但回退到已发布的包?
- javascript - 修改预加载器以输出不同的字母
- python - 使用 python 子进程和 7-zip 提取 .tgz 文件
- iframe - 如何在访问或刷新页面时随机播放 YouTube 播放列表