Haskell: Как разобрать входную строку ввода-вывода в Float (или Int или что-то еще)?
Я пытаюсь сделать программу, которая принимает номер Float, введенный пользователем с клавиатуры, и делает что-то с ним.
Однако каждый раз, когда я пытаюсь разобрать введенную строку в Float, я продолжаю получать ошибки. Каждый метод, который я пробовал, не позволил мне взять введенные пользователем данные и превратить их в Float, и это то, что мне нужно.
Моя практическая программа (а не фактическая проблема, которую я пытаюсь решить):
main = do
putStrLn "Please input a number."
inputjar <- getLine
read :: read a => String -> a
putStrLn( read inputjar :: Int)
редактировать
Еще один вопрос.
Как взять введенную строку и превратить ее во что-то, что я могу использовать в расчете?
Например, как взять введенную строку, чтобы я мог сделать что-то вроде:
(var + var) / 2
Ответы
Ответ 1
main = do
putStrLn "Please input a number."
inputjar <- readLn
print (inputjar :: Int)
Это в какой-то мере лучше, так как оно сразу фиксирует то, что мы читаем в строке:
main = do
putStrLn "Please input a number."
inputjar :: Int <- readLn
print inputjar
но для этого требуется {-#LANGUAGE ScopedTypeVariables#-}
Ответ 2
Вы говорите (read inputjar :: Int)
в своем коде, но вы говорите нам, что хотите прочитать Float
. Вы не определяете read
, берете эту строку. Вы используете putStrLn
чтобы вы могли распечатать float, но putStrLn
принимает String
, поэтому вам нужно show
значение.
main = do
putStrLn "Please input a number."
inputjar <- getLine
putStrLn $ show (read inputjar :: Float)
Ответ 3
putStrLn
выводит String
s, а не Int
s, поэтому есть два решения:
Используйте print
, который печатает все, что реализует Show
:
main = do
putStrLn "Please input a number."
inputjar <- getLine
let n = read inputjar :: Int
print n
.. или вызовите putStrLn
на исходной String
которую вы читаете в
main = do
putStrLn "Please input a number."
inputjar <- getLine
let n = read inputjar :: Int
putStrLn inputjar
В последнем примере n никогда не используется, но предположительно вы напишете какой-то код после этого, который фактически использовал бы его.
Ответ 4
Ну, я думаю, что
read :: read a => String -> a
есть просто по ошибке?
Во всяком случае, под ghci :t putStrLn
показывает:
putStrLn :: String -> IO ()
Поэтому putStrLn
принимает только String в качестве своего первого параметра, поэтому, если вы действительно хотите:
putStrLn( show (read inputjar :: Int))
BTW, read inputjar :: int
правильно, только ваш вывод неправильный.
Ответ 5
Это сработало для меня
import System.IO
getNum :: IO Integer
getNum = readLn
--call function like this
something <- getNum
--something is type Integer