【发布时间】:2013-01-25 09:55:13
【问题描述】:
我是 Haskell 的新手。我想要一个函数,在其中我从用户那里获取一个 Int 值
putStr "Please Enter Your Number : "
submit_ans<- getLine
然后在一系列计算之后返回另一个 Int,它将被另一个调用它的函数使用。所描述功能的类型是什么?最后应该使用返回函数吗?
提前致谢!
更新 #1
好的,我更新了如下功能:
myFunction :: Int -> IO Int
myFunction action = do
putStr "\tPlease Enter Your Number : "
submit_ans <- getLine
if action == 1
then do
myFunctionII read submit_ans
else do
putStrLn("\n")
它给了我这个错误:
*** Term : myFunction
*** Type : Int -> IO Int
*** Does not match : IO a
【问题讨论】:
-
你提到的这个“其他功能”,它的类型是什么?从您的 cmets 往下看,这听起来像是一个纯函数(即非 IO)。您不能从纯函数执行 IO 操作。
-
@gspr 这就是问题所在!我不知道我不能在纯功能中进行 IO 操作!话说回来,如果不能使用返回值,
IO Int的意义何在? -
当然可以用。但只能来自
IOmonad。部分“要点”确实是区分纯(非 IO)和不纯(IO)代码!当给定相同的输入时,纯函数总是返回相同的。在以 s 开头的日子里,每三个满月,一个不纯洁的人可能会烧毁你的房子并吃掉你的猫。能够区别对待这两种函数真是太好了。 -
所以我的意思是:编写一个使用
getLine获取数字的IO 函数,然后从该函数调用你想要的纯函数用你得到的号码做事(你可以得到,因为你现在在 IO monad 中)。换句话说:让 IO 代码调用纯代码,而不是相反。 -
我想我明白了。我现在将尝试实施它。谢谢!