【问题标题】:How do you calculate the number of elements in a jagged array in F#?如何计算 F# 中锯齿状数组中的元素数?
【发布时间】:2019-10-29 22:01:30
【问题描述】:

我是 F# 新手,在任何地方都没有找到答案。我正在创建一个锯齿状数组,它可以容纳 10 行和 10 列,每列的元素数量都在增加。我用于数组创建和打印的代码如下:

    let jagged = [| for a in 1 .. 10 do yield [| for a in 1 .. a do yield 0 |] |]
    let mutable len = 0;

    for arr in jagged do
        for col in arr do
            len <- (len + 1)
            printf "%i " col
        printfn "";

    printfn "%i" len

上面的代码给出以下输出

0
0 0
0 0 0
0 0 0 0
0 0 0 0 0
0 0 0 0 0 0
0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
55

目前,我正在手动计算元素数量,但想知道是否有更好的方法。

【问题讨论】:

    标签: arrays f#


    【解决方案1】:

    如果要计算单个数组的长度,可以使用Array.length。但是你所拥有的是一个不同长度的数组,你想要计算它们大小的总和。我将向您展示如何使用https://fsharpforfunandprofit.com/posts/list-module-functions/(Scott Wlaschin 的网站,这是一个非常棒的资源,顺便说一句)来自己找到答案,而不只是给您答案。此页面提供了一系列问题,可帮助您找到所需的函数:从问题 1 开始,您将转到其他问题,并最终转到有用函数列表。

    该页面上的问题 1 是“你有什么样的收藏?”选择是“我没有收藏,但我想创建一个”,或“我有一个想要使用的收藏”,或者您有两个或三个或更多收藏的其他几个选择。在这里,我们有一个想要使用的集合,因此页面将我们引导至问题 9。

    该页面上的问题 9 有很多选择,我不会在此重复,但其中之一是“如果您想将集合聚合或汇总为单个值”。这听起来像我们想要的:我们想要子数组长度的总和。所以我们转到第 14 节,其中有很多我们可以使用的函数。而列表中的一半是sumsumBy。这些听起来很有趣。 sum 函数“返回集合中元素的总和”......好吧,不,这不起作用,因为我们的数组包含数组,而不是数字。但是sumBy 函数“返回通过将函数应用于集合的每个元素而生成的结果的总和。”我们知道有一个函数可以找到单个数组的长度:Array.length。 (该页面讨论了适用于列表的函数,但几乎所有适用于列表的函数都有一个适用于数组的相应函数和一个适用于序列的类似相应函数。少数例外是诸如如何拥有无限序列,但不是无限数组或列表,所以有 Seq.initInfinite 函数但没有 Array.initInfiniteList.initInfinite 函数。

    所以现在我们已经找到了,我们只需要编写它。

    let lengthOfJaggedArray arr = arr |> Array.sumBy Array.length
    

    就是这样。不是通过两个嵌套的for 循环手动计算长度,而是有一个非常简单并使用内置函数的单行解决方案。您需要做的就是知道可用的函数 - 由于可用数组/列表/序列函数的整个列表在您刚接触 F# 时可能有点令人生畏,Scott Wlaschin 提供了一个非常有用的资源来帮助您完成它不那么令人生畏。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-08-17
      • 2017-04-19
      • 1970-01-01
      • 2019-06-26
      • 1970-01-01
      • 2018-11-05
      • 1970-01-01
      相关资源
      最近更新 更多