Подтвердить что ты не робот

Почему в вызовах типа $runsomeMonad $do...?

По-видимому, единственно возможная интерпретация runSomeMonad do ... равна runSomeMonad (do ...). Почему первый вариант не разрешен синтаксисом Haskell? Есть ли случай, когда foo do bar может быть фактически двусмысленным?

4b9b3361

Ответ 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 и т.д.). Я бы счел это ошибкой в ​​грамматике.

Исправление этого также устранит необходимость $ ввода текста.