在 F# 中从多维数组创建序列

沙巴克

我是 F# 的新手,我已经为此苦苦挣扎了一段时间。我有一个二维数组 ( [,]),我想获得这个数组中所有元素的序列。虽然似乎有迭代这样一个数组的选项(例如Array2D.iter),但我想将序列传递给其他一些函数,而不仅仅是迭代元素。

最后,我使用以下函数解决了这个问题:

let getAllElements (a: MyDiscriminatedUnionType[,]) : (seq<MyDiscriminatedUnionType>) =
    seq { for x in a do yield (x :?> MyDiscriminatedUnionType) }

这似乎有效,但对我来说看起来非常过分。由于该for .. in表达式适用于一个enumerable-expression似乎已经有一种方法可以更轻松地枚举多维数组?

此外,我无法真正弄清楚如何使此函数更通用,因此这MyDiscriminatedUnionType与所有多维数组无关,但适用于所有多维数组。

托马斯·佩特里克

要回答问题的第二部分,您可以通过将MyDiscriminatedUnionTypetype替换为泛型类型参数来使函数泛型,例如'a

let getAllElements (a:'a[,]) : seq<'a> =
    seq { for x in a do yield x :?> 'a }

我认为代码很干净 - 如果有一个内置函数(比如Array2D.toSeq会很好,我认为建议将此作为标准 F# 库的补充是合理的,但我不认为有一个这样的函数 - 然后序列表达式是编写它的好方法。

唯一令人讨厌的是你必须x使用x :?> 'a. 这是因为 2D 数组类型没有实现泛型IEnumerable<'a>接口,而只是(旧式)非泛型版本。

您可以通过迭代索引并索引到数组来避免这种情况,这有点长,但避免了丑陋的转换:

let getAllElements (a:'a[,]) : seq<'a> =
    seq { for i in 0 .. a.GetLength(0)-1 do
          for j in 0 .. a.GetLength(1)-1 do yield a.[i,j] }

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章