Voglio leggere un file in una raccolta di oggetti. I dati (è un file Leica PTX se sei curioso) sono formattati come segue:
640 [begin item #1: number of columns]
480 [number of rows]
0 0 0 [position information: 3x3 matrix]
0 0 0 [position ctd]
0 0 0 [position ctd]
1 0 0 0 [calibration information: 3x4 matrix]
0 1 0 0 [calibration ctd]
0 0 1 0 [calibration ctd]
1.1 2.2 3.3 0.5 [point 1: X Y Z I]
-0.2 2.3 1.4 0.2 [point 2: X Y Z I]
...
3.9 1.2 -7.7 0.8 [point n: X Y Z I]
640 [begin item #2: number of columns]
480 [number of rows]
0 0 0 [position information]
0 0 0
0 0 0
1 0 0 0 [calibration information]
0 1 0 0
0 0 1 0
0.2 1.3 -2.1 0.4 [point 1 of item #2]
... [etc]
vale a dire. Due righe ciascuna contenenti un singolo float / double (come testo) segnalano l'inizio di un nuovo elemento e nessun'altra riga è esattamente un numero.
È facile da fare se c'è un solo articolo per file, è una semplice operazione fold
. Sarebbe anche relativamente semplice fare con un ciclo di tipo while
che mantiene lo stato, ma sono nuovo alla programmazione funzionale e mi chiedo se non c'è un modo più conciso ed elegante per farlo a livello funzionale con strumenti standard (come reduce
, fold
, split
/ partition
, ecc.). Le migliori soluzioni che ho escogitato finora implicano "sbirciare" avanti usando liste o array, ma vorrei qualcosa che permetta la possibilità di una sequenza che viene consumata mentre itera per la massima generalità. (Sto usando F # e .NET ma non vedo questo come un problema specifico della lingua.)