Если ввод всегда действителен или исключения в порядке
Если у вас есть пользователи, вводящие десятичные числа в форме «123,456», то это можно просто преобразовать в число с плавающей запятой или двойное числоиспользуя read
:
n <- getLine
let val = read n
или в одну строку (импортировав Control.Monad
):
n <- liftM read getLine
для отлова ошибочного ввода
Приведенный выше код дает сбой, за исключением случаев, когда пользователи вводят неверные записи.Если это проблема, тогда используйте reads и listToMaybe
(из Data.Maybe
):
n <- liftM (fmap fst . listToMaybe . reads) getLine
Если этот код выглядит сложным, не беспокойтесь - ниже приведена та же операция, но выполняющая всю работус явными инструкциями case:
n <- getLine
let val = case reads n of
((v,_):_) -> Just v
_ -> Nothing
Обратите внимание, что мы сопоставляем шаблон, чтобы получить первый элемент кортежа в начале списка, заголовок списка равен (v,_)
, а первый элемент - v
,Подчеркивание (_
) означает просто «игнорировать значение в этом месте».
Если точка с плавающей запятой неприемлема
Общеизвестно, что значения с плавающей запятойПриблизительно и не подходит для финансовых расчетов в реальном мире (но, возможно, домашняя работа, в зависимости от вашего профессора)В этом случае вы хотите прочитать значения в Rational
(из Data.Ratio
).
n <- liftM maybeRational getLine
...
where
maybeRational :: String -> Maybe Rational
maybeRational str =
let (a,b) = break (=='.') str
in liftM2 (%) (readMaybe a) (readMaybe $ drop 1 b)
readMaybe = fmap fst . listToMaybe . reads