我发现了以下Haskell代码,但我很困惑:
main = putStrLn "Enter 1st String:"
>> getLine
>>= \a -> read a
Run Code Online (Sandbox Code Playgroud)
两个"大于"符号(>>)的含义是什么?一个新的声明?
两个"大于"符号后面跟一个等号(>>=)是什么意思?
此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)
1)两个大于符号的意思是一个新的陈述吗?
在这方面,是的.在IO monad中,>>与;许多命令式编程语言大致相同.
2)两个大于符号后跟等号的意思是什么?
x >>= y像x >> 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)
最后一行没有意义:它将字符串转换为整数...然后不以任何方式使用结果.