Scala 中的函数式编程:在多维列表中查找元素的索引

Functional programming in Scala: find index of an element in a multidimensional list

我有一个二维列表ll : List[List[T]]和一个函数f : T => Boolean。我想找到一个整数元组 (i, j),这样 f(l(i)(j)) == true 无论何时存在,都可能包含在 Option 中,并且想以函数式编程的方式来实现。我当前的工作解决方案如下所示:

ll.zipWithIndex
  .flatMap{case (l, i) => l.map((_, i)).zipWithIndex}
  .find{case ((l, _), j) => f(l(j))}
  .map{case ((_, i), j) => (i, j)}

但是,我觉得应该有更好的方法来实现这一点 - 我的解决方案非常麻烦,并且不能很好地推广到高维数组。那么有没有更好的方法呢?

在我开始之前:我完全知道这可以通过嵌套的 for 循环轻松实现。所以我只对函数式编程风格的解决方案感兴趣。

您没有提供任何示例输入来进行测试,但这似乎有效。它 returns 一个 IndexedSeq[(Int, Int)] 集合, 应该 (我认为)包含所有 (i,j) 对,其中 f(ll(i)(j)) returns .

ll.indices
  .flatMap(i => ll(i).indices
                     .collect{case j if f(ll(i)(j)) => (i,j)})

这和这个差不多...

for {
  i <- ll.indices
  j <- ll(i).indices
  if f(ll(i)(j))
} yield (i,j)

...并且,如评论中所述,完全兼容 FP。

(for { 
  (l, i) <- ll.zipWithIndex
  (e, j) <- l.zipWithIndex
  if f(e)
} yield (i, j)).headOption