众所周知,<-
块中的do
只是>>=
的语法糖,但是在Haskell源中的任何地方都定义了<-
,或者它只是语法结构是语言语法的一部分,因此解析器只用适当的<-
形式替换每个>>=
?
答案 0 :(得分:5)
Do表达是语言的一部分。
来自2010年Haskell语言报告:
3.14 Do Expression
lexp → do { stmts } (do expression) stmts → stmt1 … stmtn exp [;] (n ≥ 0) stmt → exp ; | pat <- exp ; | let decls ; | ; (empty statement)
do表达式提供了更常规的语法 monadic编程。它允许表达式,如
putStr "x: " >> getLine >>= \l -> return (words l)
以更传统的方式写作:
do putStr "x: " l <- getLine return (words l)
正如do的翻译所示,由let绑定的变量具有完全多态类型,而由&lt; - 定义的变量是lambda绑定的,因此是单态的。
请参阅Haskell语言报告的Do Expression。