16

我有一个简单的功能,例如:

nth :: Integer -> Integer

我尝试按如下方式打印它的结果:

main = do
    n <- getLine
    result <- nth (read n :: Integer)
    print result

生成以下错误:

Couldn't match expected type `IO t0' with actual type `Integer'
In the return type of a call of `nth'
In a stmt of a 'do' expression:
    result <- nth (read n :: Integer)

还尝试putStrLn了很多其他组合,但没有运气。
我想不通,我需要一些帮助,因为我不完全理解这些东西是如何工作IO的。

4

2 回答 2

17

nth是一个函数,而不是一个IO动作:

main = do
  n <- getLine
  let result = nth (read n :: Integer)
  print result
于 2012-04-21T23:55:50.133 回答
5

do语法在 monad 中展开某些内容。箭头右侧的所有内容都必须位于 IO monad 中,否则不会检查类型。在你的IO Integer程序中会很好。do是更明确的函数的语法糖,可以写成如下:

回顾(>>=) :: m a -> (a -> m b) -> m b

main = getLine >>= (\x ->
       nth >>= (\y ->
       print y))

Butnth不是一元值,所以应用 function 没有意义(>>=),这需要 type 的东西IO a

于 2012-04-22T05:45:51.527 回答