如果使用ord
,該類型匹配,但它不是你想要的,因爲ord
給你 ASCII值,而不是數值:ord 5
是53
,不5
。您可以減去 48以獲取數字,然後將數字向上滾動到一個數字中,但它會更容易使用庫函數。最簡單的選擇是read
:
getInt :: IO Integer
getInt = do
y <- readFile "foo.txt"
return (read (takeWhile (/='\n') y))
正如linked answer, 這裏最好的解決方案是使用reads
。
reads
發現可能匹配的列表, 作爲對(match,remainingstring)
, 這是因爲它會自動離開換行符剩餘的字符串爲你工作得很好,
*Main> reads "31324542\n" :: [(Integer,String)]
[(31324542,"\n")]
讓我們使用即:
findInt :: String -> Maybe Integer
findInt xs = case reads xs of -- have a look at reads xs
((anint,rest):anyothers) -> Just anint -- if there's an int at the front of the list, just return it
_ -> Nothing -- otherwise return nothing
Maybe
是一種方便的數據類型,可以讓您在沒有崩潰程序或執行異常處理的情況下發生故障。 Just 5
意味着你得到了輸出,它是5
。 Nothing
意味着有問題,沒有輸出。
addTen :: FilePath -> IO()
addTen filename = do
y <- readFile filename
case findInt y of
Just i -> putStrLn ("Added 10, got "++show (i+10))
Nothing -> putStrLn ("Didn't find any integer at the beginning of " ++ filename)
它給你:
*Main> addTen "foo.txt"
Added 10, got 1234567890
如果你只是想字符代表的整數,你可以在你的文件的頂部放import Data.Char
做
ordzero = ord '0' -- handy constant, 48, to unshift the ascii code to a digit.
getInts :: FilePath -> IO [Int] -- ord gives the smaller Int, not Integer
getInts filename = do
y <- readFile filename
return [ord achar - ordzero | achar <- takeWhile isDigit y]
這需要字符串y
的人物,只要他們的數字,然後 發現自己ord
,減去ord '0'
(這是48)把'4'
爲4
等
這個問題可能會有所幫助:http://stackoverflow.com/questions/2468410/convert-string-to-integer-float-in-haskell – jrajav