2016-04-16 13 views
8

Nella mia ricerca di acquisire ulteriore esperienza in Haskell, ho iniziato a lavorare con print e printf.C'è un modo per usare la stampa con i formati di printf in Haskell?

ho voluto provare a stampare un array (bene, diversi, ma è solo l'inizio) e ho voluto utilizzare il formato "%+.4f", il che significa che avrei avuto:

+2.1234 or -1.2345 

ho notato, tuttavia, che è abbastanza difficile stampare un array usando printf, quindi ho provato a passare alla stampa. Sembra più facile stampare un elenco in questo modo, ma non sono sicuro di come posso stampare gli elementi dell'elenco utilizzando lo stesso formato che ho usato per printf.

Mia lista simile a questa:

[-1.2, 2.3, 4.7, -6.850399] 

risposta

3

Due varianti che dovrebbe fare lo stesso, utilizzando le due possibili tipi di ritorno di printf:

putStrLn $ concatMap (printf "%+.4f\n") [-1.2, 2.3, 4.7, -6.850399] 
mapM_ (printf "%+.4f\n") [-1.2, 2.3, 4.7, -6.850399] 

Edit: Per il superamento di due liste profondo:

putStrLn $ (concatMap . concatMap) (printf "%+.4f\n") [[-1.2, 2.3], [4.7, -6.850399]] 
(mapM_ . mapM_) (printf "%+.4f\n") [[-1.2, 2.3], [4.7, -6.850399]] 
+0

Esiste un modo per applicarlo a un elenco di elenchi? Dì ad esempio [[-1.2, 2.3], [4.7, -6.899]]. Sono abbastanza sicuro che la mappa non funzionerebbe perché mapperei qualcosa che è stampato su alcune liste. – Xzenon

+0

Ho trovato una soluzione, ma in realtà non utilizza la tua implementazione. Sarei comunque interessato a sapere come stampare l'elenco delle liste che ho postato sopra, però (usando una qualsiasi delle tue soluzioni). – Xzenon

+0

Usa 'mapM_ (mapM_ (printf ...))' per stampare una lista di liste. – augustss

2

È possibile utilizzare le funzioni del modulo Numeric. Per esempio "% +. 4f" può essere rappresentato come

formatFloat x = showFFloat (Just 4) x "" 

È quindi possibile mappare questa funzione oltre l'elenco, per ottenere una lista di stringhe.

> map formatFloat [-1.2, 2.3, 4.7, -6.850399] 
["-1.2000","2.3000","4.7000","-6.8504"] 

(poiché questi sono già stringhe userei putStrLn invece di print per mostrare l'uscita.)

+0

che d In realtà non fa quello che "% +. 4f" fa come non mostrerà il "+" per i numeri positivi. – Xzenon

Problemi correlati