0

我是 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
4

3 回答 3

2

putStrLn有类型String -> IO (),似乎myFunctionII有类型Int -> IO (),所以类型myFunction应该是Int -> IO ()因为你的两个分支都if返回一个IO ()

myFunction :: Int -> IO ()
myFunction action = do
  putStr "\tPlease Enter Your Number : "
  submit_ans <- getLine

  if action == 1
     then myFunctionII (read submit_ans)
     else putStrLn "\n"
于 2013-01-25T13:12:56.993 回答
2

只需将您的函数编写g为 类型的纯计算即可Int -> Int。然后你在 IO monad 中使用它作为

...
putStr "Please Enter Your Number : "
submit_ans <- getLine
let i = g (read submit_ans)
...
print i

编辑:任何 Haskell 值都是纯的。函数是纯的。IO x是一个纯 Haskell 值。但它描述了一个不纯的计算,它将由系统运行(例如,当你编译的应用程序运行时)。作为执行的一部分,它将执行您的纯函数。

于 2013-01-25T10:39:07.177 回答
1

由于您正在执行 IO 操作并且您正在返回 anInt所以我最好的猜测是IO Int,但我无法确定,因为您的问题太模糊而无法清楚地回答。

于 2013-01-25T10:05:56.820 回答