我是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
目前,我正在手动计算元素数量,但想知道是否有更好的方法。
答案 0 :(得分:4)
如果要计算单个数组的长度,则可以使用Array.length
。但是,您所拥有的是一个不同长度的数组数组,您想计算它们大小的总和。我将向您展示如何使用https://fsharpforfunandprofit.com/posts/list-module-functions/(Scott Wlaschin的网站,这是非常棒的资源,顺便说一句),而不是仅仅给您答案。该页面提出了一系列问题,以帮助您找到所需的功能:从问题1开始,移至其他问题,最后移至有用的功能列表。
该页面上的问题1是:“您拥有哪种收藏?”选择是“我没有一个收藏夹,我想创建一个收藏夹”,或“我有一个我要使用的收藏夹”,或者其他几个选择,其中有两个或三个或三个以上的收藏夹。在这里,我们有一个要使用的集合,因此页面将我们引向问题9。
该页面上的问题9有很多选择,在这里我将不重复,但是其中之一是“如果要将集合汇总或汇总为单个值”。这听起来像我们想要的:我们想要子数组的长度之和。因此,我们转到第14节,该节有很多功能可以使用。列表的中间是sum
和sumBy
。那些听起来很有趣。 sum
函数“返回集合中元素的总和”……好吧,不行,因为我们的数组包含数组,而不是数字,因此不起作用。但是sumBy
函数“返回通过将该函数应用于集合的每个元素而生成的结果的总和。”而且我们知道有一个函数可以查找单个数组的长度:Array.length
。 (该页面讨论的是在列表上工作的函数,但是几乎所有在列表上工作的函数都有一个对应的函数可以在数组上工作,而类似的对应函数可以在序列上工作。很少有例外,比如如何拥有无限序列,但不是无限数组或列表,因此有一个Seq.initInfinite
函数,但没有Array.initInfinite
或List.initInfinite
函数)。
现在我们已经找到了,我们只需要编写它即可。
let lengthOfJaggedArray arr = arr |> Array.sumBy Array.length
就是这样。除了通过两个嵌套的for
循环手动计算长度外,还有一种单行解决方案非常简单,它使用内置函数。您需要做的就是知道可用的功能-并且,当您不熟悉F#时,可用数组/列表/ seq函数的整个列表可能会有些令人生畏,因此Scott Wlaschin提供了非常有用的资源来帮助实现它有点艰巨。