我是 F# 的新手,我已经为此苦苦挣扎了一段时间。我有一个二维数组 ( [,]
),我想获得这个数组中所有元素的序列。虽然似乎有迭代这样一个数组的选项(例如Array2D.iter
),但我想将序列传递给其他一些函数,而不仅仅是迭代元素。
最后,我使用以下函数解决了这个问题:
let getAllElements (a: MyDiscriminatedUnionType[,]) : (seq<MyDiscriminatedUnionType>) =
seq { for x in a do yield (x :?> MyDiscriminatedUnionType) }
这似乎有效,但对我来说看起来非常过分。由于该for .. in
表达式适用于一个enumerable-expression
似乎已经有一种方法可以更轻松地枚举多维数组?
此外,我无法真正弄清楚如何使此函数更通用,因此这MyDiscriminatedUnionType
与所有多维数组无关,但适用于所有多维数组。
要回答问题的第二部分,您可以通过将MyDiscriminatedUnionType
type替换为泛型类型参数来使函数泛型,例如'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] 删除。
我来说两句