2013-10-10 10 views
35

Sono confuso. Provo ad usare print, ma so che le persone applicano putStrLn. Quali sono le reali differenze tra loro?Differenza tra Stampa e putStrLn in Haskell

print $ function 
putStrLn $ function 
+22

'print = putStrLn. show' – Satvik

+1

Hai provato a eseguire 'print 3',' putStrLn 3', 'print" three "', 'putStrLn" three "' in ghci? Questa è davvero una domanda alla quale si può rispondere con un po 'di sperimentazione. –

risposta

61

La funzione putStrLn prende una String e la visualizza sullo schermo, seguito da un carattere di nuova riga (mettere un ing Str seguito da una nuova L i n e).

Perché funziona solo con i String s, un idioma comune è quello di prendere qualsiasi oggetto, convertirlo in un String, e quindi applicare putStrLn per visualizzarlo. Il modo generico per convertire un oggetto in un String è con la funzione show, in modo che il codice sarebbe finire con un sacco di

putStrLn (show 1) 
putStrLn (show [1, 2, 3]) 
putStrLn (show (Just 42)) 

Una volta si nota che, non è un tratto molto grande per definire una funzione che converte ad un String e visualizza la stringa in un solo passo

print x = putStrLn (show x) 

che è esattamente quello che la funzione print è.

+0

'putStrLn' può mostrare caratteri non ASCII come" я "mentre' print' non può. Però non so davvero perché. Prova 'putStrLn" я "' vs 'print" я "'. – CMCDragonkai

+1

@CMCDragonkai È per la ragione per cui do la risposta. La funzione 'print' chiama' putStrLn' sull'output di 'show', e le funzioni' show' converte le stringhe nella loro rappresentazione unicode per visualizzarle. Il punto unicode per 'я' (lettera cirillica "ya") è U + 044F, o 1103 in decimale, motivo per cui "show" я "output" "\" \\ 1103 \ "" '- questo è ciò che dovrebbe digitare ghci per ottenere la stringa composta dai sette caratteri '" \ 1103 "' (provalo!) –

+0

Non significa che sarebbe meglio usare 'putStrLn' quando si lavora con il testo in generale? – CMCDragonkai