Нет, они не одинаковы.Например,
do let x = getLine
print x
переводится в
let x = getLine in print x
, это ошибка типа, так как x
будет иметь тип IO String
.Мы просим напечатать само вычисление, а не его результат.
do x <- getLine
print x
преобразуется в
getLine >>= \x -> print x
Здесь x
связывается как результат вычисления иего тип - String
, поэтому этот тип проверяет.
В примечании do
let
просто привязывает значения к именам, как всегда, в то время как <-
используется для выполнения монадическогосвязывание, которое связывает имя с результатом вычисления.