Parsing Haskell:如何将IO输入字符串解析为浮点(或Int或其他)?

Parsing Haskell:如何将IO输入字符串解析为浮点(或Int或其他)?,parsing,haskell,input,io,floating-point,Parsing,Haskell,Input,Io,Floating Point,我正在尝试制作一个程序,它接受用户通过键盘输入的浮点数,并对其进行处理 然而,每次我试图将输入的字符串解析成一个Float,我总是会出错。我尝试过的每一种方法都不允许我获取用户输入的数据并将其转换为浮点值,这正是我所需要的 我的实践计划(不是我试图解决的实际问题)是: 您在代码中说(read inputjar::Int),但您告诉我们您想要读取一个浮点值。您没有定义读取,请删除该行。您可以使用putStrLn打印浮点,但是putStrLn需要字符串,因此需要显示该值 main = do

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

然而,每次我试图将输入的字符串解析成一个Float,我总是会出错。我尝试过的每一种方法都不允许我获取用户输入的数据并将其转换为浮点值,这正是我所需要的

我的实践计划(不是我试图解决的实际问题)是:

您在代码中说
(read inputjar::Int)
,但您告诉我们您想要读取一个
浮点值。您没有定义
读取
,请删除该行。您可以使用
putStrLn
打印浮点,但是
putStrLn
需要
字符串,因此需要
显示该值

main = do
    putStrLn "Please input a number."
    inputjar <- getLine
    putStrLn $ show (read inputjar :: Float)
main=do
putStrLn“请输入一个数字。”
输入jar我猜

read :: read a => String -> a
是不是误会了

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

putStrLn :: String -> IO ()
因此,
putStrLn
只接受字符串作为其第一个参数,因此如果您确实想:

putStrLn( show (read inputjar :: Int))
顺便说一句,
read-inputjar::int
是正确的,只有您的输出是错误的。

main=do
main = do
   putStrLn "Please input a number."
   inputjar <- readLn
   print (inputjar :: Int)
putStrLn“请输入一个数字。”
inputjar
putStrLn
打印出
String
s,而不是
Int
s,因此有两种解决方案:

使用
print
,它可以打印实现
Show
的任何内容:

main = do
    putStrLn "Please input a number."
    inputjar <- getLine
    let n = read inputjar :: Int
    print n
在后一个示例中,从未使用过n,但您可能会在之后编写一些实际使用它的代码。

这对我很有用

import System.IO

getNum :: IO Integer 
getNum = readLn 

--call function like this
something <- getNum
--something is type Integer
import System.IO
getNum::IO整数
getNum=readLn
--像这样调用函数

你能解释一下为什么有
read::reada=>String->a
表达式吗?(这是一个严肃的问题:这是一个理解和调试的好方法。)一位帮助我的朋友告诉我,要么把它放进去,要么读下去,这是行不通的。我当时几乎在尝试任何东西,并认为这是必要的。我想这位朋友的意思是,你可以将你对
read
的使用与它的签名进行专门化,例如
print((read::String->Int)inputjar)
(我们在这里使用print是因为它是数字,而不是我们正在使用的字符串。)编译器已经知道了最常见的
read
类型,即
reada=>String->a
,这无助于它理解用户输入的含义。在这种情况下,您也可以执行
print(读取inputjar::Int)
——您上面的主要错误是使用
putstrn
,它只作用于字符串,而不是打印。@PhilipEloy:既然“有人在这一页上回答了”,请接受相关的回答。如果其他人问了基本相同的问题,并且答案在该问题中,请在评论中链接到该问题,这样我们就可以将此问题作为另一个问题的重复链接关闭。好的,成功了。太棒了。非常感谢。如果我想将inputjar的内容用于其他用途(比如实际计算),我还需要做什么;在此上下文中,我拒绝使用
IO
键入。@应用程序这样键入IO不好吗?这似乎是最简单的解决方案,但听起来你有所保留。
main = do
   putStrLn "Please input a number."
   inputjar :: Int  <- readLn
   print inputjar
main = do
    putStrLn "Please input a number."
    inputjar <- getLine
    let n = read inputjar :: Int
    print n
main = do
    putStrLn "Please input a number."
    inputjar <- getLine
    let n = read inputjar :: Int
    putStrLn inputjar
import System.IO

getNum :: IO Integer 
getNum = readLn 

--call function like this
something <- getNum
--something is type Integer