3 people like it.

Initialization of 2D array that may fail

A function to initialize 2D array that supports failures - if the initializer fails to produce value for any of the array locations, the construction is stopped and the function returns 'None'

 1: 
 2: 
 3: 
 4: 
 5: 
 6: 
 7: 
 8: 
 9: 
10: 
11: 
12: 
13: 
14: 
15: 
16: 
17: 
18: 
19: 
20: 
21: 
22: 
23: 
24: 
/// Attempts to initialize a 2D array using the specified base offsets and lengths.
/// The provided function can return 'None' to indicate a failure - if the initializer
/// fails for any of the location inside the array, the construction is stopped and
/// the function returns 'None'.
let tryInitBased base1 base2 length1 length2 f = 
  let arr = Array2D.createBased base1 base2 length1 length2 (Unchecked.defaultof<_>)
  /// Recursive function that fills a specified 'x' line
  /// (returns false as soon as any call to 'f' fails, or true)
  let rec fillY x y = 
    if y < (base2+length2) then
      match f x y with
      | Some v -> 
          arr.[x, y] <- v
          fillY x (y + 1)
      | _ -> false
    else true
  /// Recursive function that iterates over all 'x' positions
  /// and calls 'fillY' to fill individual lines
  let rec fillX x = 
    if x < (base1+length1) then 
      if fillY x base2 then fillX (x + 1)
      else false
    else true
  if fillX base1 then Some arr else None
val tryInitBased : base1:int -> base2:int -> length1:int -> length2:int -> f:(int -> int -> 'a option) -> 'a [,] option

Full name: Script.tryInitBased


 Attempts to initialize a 2D array using the specified base offsets and lengths.
 The provided function can return 'None' to indicate a failure - if the initializer
 fails for any of the location inside the array, the construction is stopped and
 the function returns 'None'.
val base1 : int
val base2 : int
val length1 : int
val length2 : int
val f : (int -> int -> 'a option)
val arr : 'a [,]
module Array2D

from Microsoft.FSharp.Collections
val createBased : base1:int -> base2:int -> length1:int -> length2:int -> initial:'T -> 'T [,]

Full name: Microsoft.FSharp.Collections.Array2D.createBased
module Unchecked

from Microsoft.FSharp.Core.Operators
val defaultof<'T> : 'T

Full name: Microsoft.FSharp.Core.Operators.Unchecked.defaultof
val fillY : (int -> int -> bool)


 Recursive function that fills a specified 'x' line
 (returns false as soon as any call to 'f' fails, or true)
val x : int
val y : int
union case Option.Some: Value: 'T -> Option<'T>
val v : 'a
val fillX : (int -> bool)


 Recursive function that iterates over all 'x' positions
 and calls 'fillY' to fill individual lines
union case Option.None: Option<'T>
Raw view New version

More information

Link:http://fssnip.net/lJ
Posted:3 years ago
Author:Tomas Petricek
Tags: array , 2d , initialize , option