我正在完成Scheme in 48 hours的第1章练习。对于问题2,我想使用read
函数将字符串转换为数字,但下面的代码不起作用。
main = do
args <- getArgs
myNum <- read $ args !! 0
putStrLn myNum
以下是来自ghc的错误消息:
ex2.hs:7:12:
No instance for (Read (IO t0)) arising from a use of ‘read’
In the expression: read
In a stmt of a 'do' block: one <- read $ (args !! 0)
In the expression:
do { args <- getArgs;
myNum <- read $ (args !! 0);
putStrLn myNum }
答案 0 :(得分:4)
这里有一些问题。
首先,要在此函数中保存变量,您需要使用let variable = "something"
类型的语句而不是<-
绑定运算符。这里,let myNum = read (args !! 0)
采用第一个命令行参数。
接下来,我们使用read
将myNum
转换为任何类型,但我们还需要明确定义类型(我为此示例选择 Float )进行打印输出返回命令行。否则,您会收到错误消息,例如"Prelude.read: no parse"
从String转换为Number返回String的代码如下所示......
main = do
-- get command line arguments
args <- getArgs
-- get the first indexed element; convert it from string to float
let myNum = read (args !! 0) :: Float
-- print this number to the command line (as a string)
putStrLn (show myNum)