我发现了以下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)
最后一行没有意义:它将字符串转换为整数...然后不以任何方式使用结果.