在Haskell中将输出整数输出到stdout

时间:2012-04-21 23:46:31

标签: haskell io

我有一个简单的功能:

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的内容是如何工作的。

2 个答案:

答案 0 :(得分:13)

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

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

答案 1 :(得分:5)

do语法在monad中展开某些内容。箭头右侧的所有内容都必须位于IO monad中,否则类型不会检查。 IO Integer在您的计划中没问题。 do是更明确的函数的语法糖,其编写如下:

回想一下(>>=) :: m a -> (a -> m b) -> m b

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

但是nth不是monadic值,因此应用函数(>>=)没有意义,这需要IO a类型的函数。