По-видимому, единственно возможная интерпретация runSomeMonad do ... равна runSomeMonad (do ...). Почему первый вариант не разрешен синтаксисом Haskell? Есть ли случай, когда foo do bar может быть фактически двусмысленным?
Почему в вызовах типа $runsomeMonad $do...?
Ответ 1
Обратите внимание, что вы можете наблюдать этот эффект не только с do, но также let, if, \, case, расширения mdo и proc... и страшный унарный -. Я не могу придумать случай, когда это неоднозначно, за исключением унарного -. Вот как грамматика определена в Haskell 2010 Language Report, §3: Выражения.
exp
→ infixexp :: [context =>] type
| infixexp
infixexp
→ lexp qop infixexp
| - infixexp
| lexp
lexp
→ \ apat1 … apatn -> exp
| let decls in exp
| if exp [;] then exp [;] else exp
| case exp of { alts }
| do { stmts }
| fexp
fexp
→ [fexp] aexp
aexp
→ ( exp )
| …
В fexp (function application) или aexp (буквальное выражение) просто не существует случая, который допускает unparenthesized lexp (lambda, let и т.д.). Я бы счел это ошибкой в грамматике.
Исправление этого также устранит необходимость $ ввода текста.