2015-01-14 6 views
13

Haskell उदाहरण से http://learnyouahaskell.com/types-and-typeclassesहास्केल Prelude.read: कोई पार्स स्ट्रिंग

ghci> read "5" :: Int 
5 
ghci> read "5" :: Float 
5.0 
ghci> (read "5" :: Float) * 4 
20.0 
ghci> read "[1,2,3,4]" :: [Int] 
[1,2,3,4] 
ghci> read "(3, 'a')" :: (Int, Char) 
(3, 'a') 

लेकिन जब मैं

read "asdf" :: String 

या

read "asdf" :: [Char] 

कोशिश मैं अपवाद

Prelude.read कोई पार्स

मैं यहां क्या गलत कर रहा हूं?

उत्तर

28

इसका कारण यह है स्ट्रिंग प्रतिनिधित्व आपके पास एक String की स्ट्रिंग प्रतिनिधित्व नहीं है है, यह स्वयं स्ट्रिंग में एम्बेडेड उद्धरण की जरूरत है:

> read "\"asdf\"" :: String 
"asdf" 

यह इसलिए है कि read . show === idString के लिए:

> show "asdf" 
"\"asdf\"" 
> read $ show "asdf" :: String 
"asdf" 

एक साइड नोट के रूप में, फ़ंक्शन Text.Read:

से फ़ंक्शन का उपयोग करना हमेशा अच्छा विचार है।
> :t readMaybe 
readMaybe :: Read a => String -> Maybe a 
> readMaybe "asdf" :: Maybe String 
Nothing 
> readMaybe "\"asdf\"" :: Maybe String 
Just "asdf" 

यह (मेरी राय में) read फ़ंक्शन टूटा हुआ है जो पार्स विफलता पर अपवाद उठाता है।

संबंधित मुद्दे