将整数输出到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
nn
是一个函数,而不是一个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
放在错误消息中。