2

我正在尝试使用 F# 解决Project Euler Problem #11,但在弄清楚如何实例化原始网格时遇到了问题。

我试过了:

let grid : int [,] = [|[|08; 02; 22; 97; 38; 15; 00; 40; 00; 75; 04; 05; 07; 78; 52; 12; 50; 77; 91; 08|]
                        [|49; 49; 99; 40; 17; 81; 18; 57; 60; 87; 17; 40; 98; 43; 69; 48; 04; 56; 62; 00|]
                        [|81; 49; 31; 73; 55; 79; 14; 29; 93; 71; 40; 67; 53; 88; 30; 03; 49; 13; 36; 65|]
                        [|52; 70; 95; 23; 04; 60; 11; 42; 69; 24; 68; 56; 01; 32; 56; 71; 37; 02; 36; 91|]
                        [|22; 31; 16; 71; 51; 67; 63; 89; 41; 92; 36; 54; 22; 40; 40; 28; 66; 33; 13; 80|]
                        [|24; 47; 32; 60; 99; 03; 45; 02; 44; 75; 33; 53; 78; 36; 84; 20; 35; 17; 12; 50|]
                        [|32; 98; 81; 28; 64; 23; 67; 10; 26; 38; 40; 67; 59; 54; 70; 66; 18; 38; 64; 70|]
                        [|67; 26; 20; 68; 02; 62; 12; 20; 95; 63; 94; 39; 63; 08; 40; 91; 66; 49; 94; 21|]
                        [|24; 55; 58; 05; 66; 73; 99; 26; 97; 17; 78; 78; 96; 83; 14; 88; 34; 89; 63; 72|]
                        [|21; 36; 23; 09; 75; 00; 76; 44; 20; 45; 35; 14; 00; 61; 33; 97; 34; 31; 33; 95|]
                        [|78; 17; 53; 28; 22; 75; 31; 67; 15; 94; 03; 80; 04; 62; 16; 14; 09; 53; 56; 92|]
                        [|16; 39; 05; 42; 96; 35; 31; 47; 55; 58; 88; 24; 00; 17; 54; 24; 36; 29; 85; 57|]
                        [|86; 56; 00; 48; 35; 71; 89; 07; 05; 44; 44; 37; 44; 60; 21; 58; 51; 54; 17; 58|]
                        [|19; 80; 81; 68; 05; 94; 47; 69; 28; 73; 92; 13; 86; 52; 17; 77; 04; 89; 55; 40|]
                        [|04; 52; 08; 83; 97; 35; 99; 16; 07; 97; 57; 32; 16; 26; 26; 79; 33; 27; 98; 66|]
                        [|88; 36; 68; 87; 57; 62; 20; 72; 03; 46; 33; 67; 46; 55; 12; 32; 63; 93; 53; 69|]
                        [|04; 42; 16; 73; 38; 25; 39; 11; 24; 94; 72; 18; 08; 46; 29; 32; 40; 62; 76; 36|]
                        [|20; 69; 36; 41; 72; 30; 23; 88; 34; 62; 99; 69; 82; 67; 59; 85; 74; 04; 36; 16|]
                        [|20; 73; 35; 29; 78; 31; 90; 01; 74; 31; 49; 71; 48; 86; 81; 16; 23; 57; 05; 54|]
                        [|01; 70; 54; 71; 83; 51; 54; 69; 16; 92; 33; 48; 61; 43; 52; 01; 89; 19; 67; 48|]|]

以及许多其他没有运气的排列。我所有的尝试都给了我:

这个表达式应该有类型int [,],但这里有类型'a[]

如何实例化矩形数组而不必单独设置每个单元格?

4

2 回答 2

7

您可以使用内置库函数array2D。它将数组数组int[][]转换为二维数组int[,]。您可以这样称呼它(使用稍小的输入数组):

let grid = 
  array2D [| [|08; 02; 22; |]
             [|49; 49; 99; |]         
             [|01; 70; 54; |] |]

或者您可以使用流水线操作符并像这样调用它:

let grid = 
  [| [|08; 02; 22; |]
     [|49; 49; 99; |]         
     [|01; 70; 54; |] |] |> array2D

虽然这不是构建 2D 数组的特殊语言语法,但它实际上可以作为一个。- F# 有许多类似的函数,您可以使用它们来构造集合、不可变映射和其他类型。在下面的示例中,seqanddict都是函数,但您可以将它们视为语法(对于某些其他数据类型,还有更长的函数,例如Map.ofSeq):

dict [ "cz", "Ahoj"; "en", "Hello" ]
seq { 1 .. 100 }

该函数实际上适用于任何集合集合(不仅仅是数组数组),因为它具有以下类型:

val array2D : seq<#seq<'a>> -> 'a[,]

这意味着它需要实现接口(内部)seq的任何类型的任何序列(外部)-因此您还可以使用更复杂的序列推导生成数据,然后将其传递给.IEnumerable#seqarray2D

于 2013-05-26T11:11:49.330 回答
0

这个怎么样:

let my2DArray = 
    [| for i in 0 .. rowCount - 1 do 
        yield [| for i in 0 ..columnCount - 1 do yield init |] 
    |] |> array2D
于 2015-04-01T10:36:08.603 回答