将整数输出到Haskell中的标准输出

将整数输出到Haskell中的标准输出,haskell,io,Haskell,Io,我有一个简单的函数,如: nth :: Integer -> Integer 我试着将结果打印如下: main = do n <- getLine result <- nth (read n :: Integer) print result main=do nn是一个函数,而不是一个IO操作: main = do n <- getLine let result = nth (read n :: Integer) print resu

我有一个简单的函数,如:

nth :: Integer -> Integer
我试着将结果打印如下:

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

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

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

ndo
语法将单子中的某些内容展开。箭头右侧的所有内容都必须位于IO monad中,否则类型不会检查。在您的程序中,输入一个
IO整数就可以了
do
是更明确的函数的语法糖,其编写如下:

main = do
    n <- getLine
    result <- nth (read n :: Integer)
    print result
回想一下
(>>=)::ma->(a->mb)->mb

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

但是
n
不是一元值,因此应用函数
(>>=)
没有意义,因为它不执行任何I/O…?执行语法和绑定,因此需要类型为
IO a

的内容(
x IO b
甚至只是
func::IO b
,那么你不能使用bind,但可以使用let语句。太好了,谢谢。但是在
print
之前使用
let
和直接调用
print nth(read…
)之间有什么区别呢?没有区别。
print(nth(read n::Integer))
也可以。一行:
main=print.nth.read=谢谢,现在我想“哦,从这里开始,我收到了预期的
m0a0
我收到了…”为了进一步澄清,
m0
来自以下事实:
(>=)::Monad m=>ma->(a->mb)->mb
。它适用于任何monad,不仅是
IO
,而且在您的情况下,编译器没有机会找出
m
IO
,因此它将
m0
放在错误消息中。