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