По-видимому, единственно возможная интерпретация 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
и т.д.). Я бы счел это ошибкой в грамматике.
Исправление этого также устранит необходимость $
ввода текста.