获取并在Haskell中放入一个字符串会引发错误

-2 haskell ghc

我发现了以下Haskell代码,但我很困惑:

main = putStrLn "Enter 1st String:"  
  >> getLine
  >>= \a -> read a
Run Code Online (Sandbox Code Playgroud)
  1. 两个"大于"符号(>>)的含义是什么?一个新的声明?

  2. 两个"大于"符号后面跟一个等号(>>=)是什么意思?

此Haskell代码抛出以下错误:

a.hs:3:13:
No instance for (Read (IO t0)) arising from a use of ‘read’
In the expression: read a
In the second argument of ‘(>>=)’, namely ‘\ a -> read a’
In the expression:
  putStrLn "Enter 1st String:" >> getLine >>= \ a -> read a
Run Code Online (Sandbox Code Playgroud)

chi*_*chi 5

1)两个大于符号的意思是一个新的陈述吗?

在这方面,是的.在IO monad中,>>;许多命令式编程语言大致相同.

2)两个大于符号后跟等号的意思是什么?

x >>= yx >> y不同的是它的结果x,适用于y,它必须是一个函数.简而言之,getLine >>= \a -> action意思是"读取一行,将该值绑定到变量a,然后运行action(可以依赖于a).

我建议使用monad教程来完全理解这些.您可以从一般教程开始,例如LYAH.

您的代码通常用do符号编写:

main = do
  putStrLn "Enter 1st String:"  
  a <- getLine
  read a
Run Code Online (Sandbox Code Playgroud)

最后一行没有意义:read返回一个值但不执行任何I/O,因此我们无法将其链接到一系列I/O操作.这会触发编译器错误.如果您了解一些命令式编程,请考虑伪代码

print("some message");
a = inputLine();
toInteger(a);
Run Code Online (Sandbox Code Playgroud)

最后一行没有意义:它将字符串转换为整数...然后不以任何方式使用结果.