16

我正在尝试制作一个程序,该程序采用用户通过键盘输入的浮点数并对其进行处理。

但是,每次我尝试将输入的字符串解析为浮点数时,我都会不断出错。我尝试过的每一种方法都无法让我获取用户输入的数据并将其转换为浮点数,而这正是我所需要的。

我的练习计划(不是我要解决的实际问题)是:

main = do
    putStrLn "Please input a number."
    inputjar <- getLine
    read :: read a => String -> a
    putStrLn( read inputjar :: Int)

编辑

还有一个问题。

如何获取输入的字符串并将其转换为可以在计算中使用的内容?

例如,如何获取输入的字符串,以便可以执行以下操作:

(var + var) / 2
4

5 回答 5

10
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#-}

于 2012-07-14T06:19:33.397 回答
5

putStrLn打印出Strings,而不是Ints,所以有两种解决方案:

使用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,但大概您会在实际使用它之后编写一些代码。

于 2012-07-14T13:47:18.890 回答
5

(read inputjar :: Int)在代码中说,但您告诉我们您想阅读Float. 你没有定义read,把那条线去掉。您使用putStrLn以便可以打印出浮点数,但putStrLn需要 a String,因此您需要show该值。

main = do
    putStrLn "Please input a number."
    inputjar <- getLine
    putStrLn $ show (read inputjar :: Float)
于 2012-07-14T05:44:48.437 回答
3

好吧,我猜

read :: read a => String -> a

只是误会了吗?

无论如何,在 ghci 下,:t putStrLn显示:

putStrLn :: String -> IO ()

所以putStrLn只接受 String 作为它的第一个参数,所以如果你真的想:

putStrLn( show (read inputjar :: Int))

顺便说一句,read inputjar :: int是正确的,只有你的输出是错误的。

于 2012-07-14T05:45:03.877 回答
-4

这对我有用

import System.IO

getNum :: IO Integer 
getNum = readLn 

--call function like this
something <- getNum
--something is type Integer
于 2015-03-01T23:07:55.237 回答