Во-первых, следующий блок кода определяет пять функций , а не пять целочисленных значений:
let setArray (description: int * int * int * int * int) =
let id = fun (i, _, _, _, _) -> i
let startX = fun (_, x, _, _, _) -> x
let startY = fun (_, _, y, _, _) -> y
let width = fun (_, _, _, w, _) -> w
let height = fun (_, _, _, _, h) -> h
Что вы, вероятно, намеревались сделать, это передать кортеж description
в каждыйиз этих функций деструктурирования, например так:
let setArray (description: int * int * int * int * int) =
let id = description |> (fun (i, _, _, _, _) -> i)
let startX = description |> (fun (_, x, _, _, _) -> x)
let startY = description |> (fun (_, _, y, _, _) -> y)
let width = description |> (fun (_, _, _, w, _) -> w)
let height = description |> (fun (_, _, _, _, h) -> h)
Но есть гораздо более простой способ сделать это.F # позволяет вам деструктурировать кортеж в сигнатуре функции.Таким образом, вы можете заменить весь этот блок кода следующим:
let setArray (id, startX, startY, width, height) =
Вот и все!Итак, теперь вся ваша функция выглядит так:
let setArray (id, startX, startY, width, height) =
let arrayResult = Array2D.init (width + 1) (height + 1) (fun i j -> if i < width && j < height then id)
arrayresult
И есть еще одно упрощение, которое вы можете сделать.В любое время, когда let x = (some calculation)
сразу за ним следует x
в качестве возвращаемого значения функции, вы можете избавиться от этого let
и просто вернуть функцию (some calculation)
.Применяя это упрощение, ваша функция становится:
let setArray (id, startX, startY, width, height) =
Array2D.init (width + 1) (height + 1) (fun i j -> if i < width && j < height then id)
И все готово!Если вы действительно хотите указать, что id
, startX
и т. Д. Являются целыми числами, вы можете сделать это следующим образом:
let setArray (id : int, startX : int, startY : int, width : int, height : int) =
Array2D.init (width + 1) (height + 1) (fun i j -> if i < width && j < height then id)