F #: перебирать массив int - PullRequest
2 голосов
/ 25 марта 2020

Я хотел перебрать массив, и у каждого элемента есть три целых числа. Можно ли перебирать каждое целое число в этом массиве? Приведенный ниже код не работает, поскольку выдает следующую ошибку:

"Тип 'int * int * int' не совместим с типом 'seq <' a> '"

module Practice2

    let dataSet = 
        [|10, 20, 10; -20, -30, 10; 30, 50, 0;|]
        |> Seq.mapi (fun i elem -> 
            elem
            |> Seq.map (fun a -> printf("TEST"))
            );

Я совершенно новичок в F #, поэтому, пожалуйста, поправьте меня, если это совершенно неправильный подход.

Ответы [ 2 ]

3 голосов
/ 25 марта 2020

Добро пожаловать в F #. Ваши данные представляют собой массив из трех кортежей. F # говорит так же, когда вы оцениваете это выражение:

[|10, 20, 10; -20, -30, 10; 30, 50, 0|]
// val it : (int * int * int) [] = [|(10, 20, 10); (-20, -30, 10); (30, 50, 0)|]

Конечно, вы можете перебирать этот массив с индексом. Как правило, используйте функции этого модуля, относящиеся к используемой вами структуре данных, здесь Array.

[|10, 20, 10; -20, -30, 10; 30, 50, 0|]
|> Array.iteri (printfn "%i: %A")
// 0: (10, 20, 10)
// 1: (-20, -30, 10)
// 2: (30, 50, 0)

Теперь для реального массива массивов вы можете легко определить свои собственные функции. Мы собираемся создать функцию, которая выполняет итерацию этого массива массивов. Следовательно, два индекса i и j для внешнего и внутреннего массива.

module Array =
    let iteri2 f = Array.iteri (fun i -> Array.iteri (f i))
    // val iteri2 : f:(int -> int -> 'a -> unit) -> ('a [] [] -> unit)
[|[|10; 20; 10|];[|-20; -30; 10|];[|30; 50; 0|]|]
|> Array.iteri2 (printfn "%i, %i: %i")
// 0, 0: 10
// 0, 1: 20
// 0, 2: 10
// 1, 0: -20
// 1, 1: -30
// 1, 2: 10
// 2, 0: 30
// 2, 1: 50
// 2, 2: 0
3 голосов
/ 25 марта 2020

Предложение:

let dataSet = 
    [10, 20, 10; -20, -30, 10; 30, 50, 0]
    |> List.collect (fun (a,b,c) -> [a;b;c])    //transforms (int*int*int) list into an int list
    |> List.iter (fun _ -> printfn "TEST")      //prints
...