2012-04-21 41 views
8

标准输出,我有这样一个简单的函数:输出整型在Haskell

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 s工作。

+2

单行:'main = print。 nth。阅读=“getLine' – JJJ 2012-04-22 06:40:38

回答

12

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

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

酷!但是,为什么这样呢? – 2012-04-22 00:15:27

+0

因为它没有做任何I/O ...? – 2012-04-22 00:46:25

+1

语法和绑定('x < - action')仅用于Monads。如果你是初学者,那么你使用的唯一monad就是'IO'。如果你的函数不是'func :: a - > IO b'或者甚至只是'func :: IO b'的形式,那么你不能使用bind,但是你可以使用let语句。 – 2012-04-22 01:02:43

4

do语法解开一个单子之内的东西。箭头右侧的所有东西都必须存在于IO monad中,否则类型不检查。在你的程序中,IO Integer会很好。 do是这将写入如下的更加明确的功能语法糖:

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

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

nth不是一元价值,所以它没有任何意义应用功能(>>=) ,这需要类型IO a

+0

谢谢,现在我很喜欢“哦,所以从这里来,期待'm0 a0'我正在接受......” – 2012-04-22 07:20:25

+1

为了澄清一点,'m0'来自这样的事实:'(>> =):: Monad m => ma - >(a - > mb) - > mb'。它适用于任何monad,不仅是'IO',在你的情况下,编译器没有机会找出'm'是'IO',所以它会在错误信息中加入'm0'。 – nponeccop 2012-04-22 10:49:46