【发布时间】:2016-05-22 00:14:15
【问题描述】:
为了一个任务,我必须写一个函数
zipWith[A,B,C](f:Function2[A,B,C], l1:List[A], l2:List[B]) : List[C]
接受两个列表和一个函数并返回另一个列表。 例如:
zipWith((x: Int, y: Int) => x + y, List(1, 2, 3), List(4, 5, 6))
→ List(5, 7, 9)
所以我开始压缩 l1 和 l2 并尝试映射结果列表:
(l1 zip l2) map ((x:A, y:B) => f(x,y))
给出“类型不匹配:找到:(A,B) => C,需要:((A,B)) => ?”
我研究了一下,找到了两个解决方案,但我不明白为什么会这样:
(l1, l2).zipped map ((x:A, y:B)) => f(x,y))
我签入了 REPL:
l1 zip l2 => List[(A, B)]
同时
(l1, l2).zipped => scala.runtime.Tuple2Zipped[A,List[A],B,List[B]]
在我看来,哪个看起来不像 ((A,B)) 而不是 (A,B)?
谁能解释一下?
另一种解决方案,
(l1 zip l2) map { case (x, y) => f(x, y) }
涉及一种隐藏类型的模式匹配(或者我理解),我不应该将其用于分配。
【问题讨论】:
-
确实,这是重复的……但这个问题比另一个 IMO 更好地表达和提出。
-
现在,如果我要设置分配,我也不会允许
zip(在我看来非常像实现类似地图功能的分配,而不仅仅是zip并使用map. 如果列表长度不同,你的函数应该做什么? -
@TheArchetypalPaul 没有关于这种行为的消息。作业内容如下: 使用 map 和/或 fold 定义以下非递归函数(没有模式匹配和递归调用)。您可以使用“List”类的任何方法,但不能使用自己的辅助方法。另一个问题很可能确实来自我的一位同学。抱歉重复了。
-
@ClausRuepp,感谢您提供详细信息。我只是在猜测/“猜测”。
标签: list scala dictionary zip