Если вы хотите рассчитать длину одного массива, вы можете использовать Array.length
.Но у вас есть массив массивов разной длины, и вы хотите вычислить сумму их размеров.Вместо того, чтобы просто дать вам ответ, я покажу вам, как вы можете использовать https://fsharpforfunandprofit.com/posts/list-module-functions/ (сайт Скотта Влашина, это действительно потрясающий ресурс, кстати), чтобы найти ответ самостоятельно.На этой странице представлен ряд вопросов, которые помогут вам найти нужные функции: начиная с вопроса 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
, есть однострочное решение, которое довольно просто и использует встроенные функции.Все, что вам нужно было сделать, это знать, какие функции доступны - и поскольку весь список доступных функций array / list / seq может быть немного пугающим, когда вы новичок в F #, Скотт Влашин сделал очень полезный ресурс, чтобы помочь сделать егонемного менее пугающим.