Извлечение элементов из 2-го списка - PullRequest
0 голосов
/ 13 ноября 2018

У меня есть следующий список 2d

[ [a1 ; a2 ; a3 ; a4] ;
  [b1 ; b2 ; b3 ; b4] ;
  [c1 ; c2 ; c3 ; c4] ]

и у меня есть функция ввода F. У меня есть следующая проблема: учитывая двумерный список m и функцию f, вычислить i-е значение в столбец результата c с использованием i-го значения из каждого столбца в м.

[ f [a1; b1; c1]; f [a2; b2; c2]; f [a3; b3; c3]; f [a4; b4; c4]; f [a5; b5; c5] ]

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

Любая помощь приветствуется

Ответы [ 2 ]

0 голосов
/ 10 декабря 2018

Может быть, вы можете попробовать это:

open List;;

let map2d f l =
  let rec aux acc l =
    try (
      let l'=map hd l and
          l =map tl l in
      aux (f l'::acc) l
    ) with _ -> rev acc
  in
  if l=[] then [] else aux [] l
;;

Test

let f = fold_left (+) 0;;
let id x = x;;

let m=[ [11 ; 12 ; 13 ; 14] ;
        [21 ; 22 ; 23 ; 24] ;
        [31 ; 32 ; 33 ; 34] ];; 

# map2d id m;;
- : int list list = [[11; 21; 31]; [12; 22; 32]; [13; 23; 33]; [14; 24; 34]]

# map2d f m;;
- : int list = [63; 66; 69; 72]

# map2d id [[11;21];[12];[13]];;
- : int list list = [[11; 12; 13]]

# map2d id [[];[]];;
- : 'a list list = []
# map2d f [[];[]];;
- : int list = []
0 голосов
/ 05 декабря 2018

Я не уверен, что понял вопрос.

Но, как я вижу из вашего примера, я бы транспонировал ваш список списков (см. транспонирование списка списков )

пример:

let rec transpose list = match list with
| []             -> []
| []   :: xss    -> transpose xss
| (x::xs) :: xss ->
    (x :: List.map List.hd xss) :: transpose (xs :: List.map List.tl xss);;

//An example of int list list
let m=[ [11 ; 12 ; 13 ; 14] ;
        [21 ; 22 ; 23 ; 24] ;
        [31 ; 32 ; 33 ; 34] ];;

//An example of int list-> int function
let f list = List.fold_right (+) list 0;;

List.map f (transpose m);;

Это дает [f [11; 21; 31]; f [12; 22; 32]; f [13; 23; 33]; f [14; 24; 34]]

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...