我有一个简单的功能:
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
的内容是如何工作的。
答案 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
类型的函数。