How about indexing your fragments with the appropriate coordinate? Thus, the elements in your one-dimensional list will look like:
(int * int * ref tile)
Then you can filter the rows / columns / diagonals as follows:
String n: (precondition: 0 <= n, u, v <= 3)
List.filter tiles (fun x -> match x with (u, v, _) -> u = n);;
Column n: (precondition: 0 <= n, u, v <= 3)
List.filter tiles (fun x -> match x with (u, v, _) -> v = n);;
Diagonal 1: (precondition: 0 <= u, v <= 3)
List.filter tiles (fun x -> match x with (u, v, _) -> u = v);;
Diagonal 2: (precondition: 0 <= u, v <= 3)
List.filter tiles (fun x -> match x with (u, v, _) -> u + v = 3);;
It should also be possible to index tiles with only one integer (tile index within a single-d-list), but this requires some calculations in the filter function (given index, print the coordinate, and then decide whether it belongs to the desired row / column / diagonals).