Проблема не в функции toTypeList
, поэтому вам не нужно проверять, пусто ли strArray
или нет.Он выдаст ошибку, если вы проверите inObj.[0].Length
в функции to2DStrArray
, когда входной массив пуст.Безопасный способ создания Array2D из массива массива - использование оператора array2D :
let to2DStrArray (inObj : string[][]) =
array2D inObj
Конечно, вы должны гарантировать, что все внутренние массивы имеют одинаковую длину.А другая функция сокращается следующим образом:
let toTypedList typeFunc (strArray : string[,]) =
List.init (Array2D.length1 strArray) typeFunc
Учитывая ваш вариант использования, обратите внимание, что [| [||] |] не является пустой строкой [] [];это массив, который состоит только из одного элемента, который, в свою очередь, является пустым строковым массивом .Следовательно, это вызывает проблему для анонимной функции, которую вы передали toTypedList
.Поскольку двумерный массив имеет length2 <= 1
, и вы получаете доступ к двум первым индексам, это приводит к индексу связанного исключения.Функцию можно исправить, возвращая значения параметров, и вы можете извлечь значения из значений параметров для последующего использования:
let testData = to2DStrArray [|[||]|]
let failingCall = testData
|> toTypedList (fun row -> if Array2D.length2 testData >= 2 then Some (Double.Parse(testData.[row,0]), Double.Parse(testData.[row,1])) else None)