2015-08-29 2 views
1

$ является инфиксным оператором с наименьшим возможным старшинства:

е $ а = фа

ли это не означает, что, в приведенном ниже выражении, часть

$ 2^2

должны быть оценены пихты t, а затем добавить $ 2? Оказывается 2 + 2 вычисляется первый

Prelude> (2 ^) $ 2 + 2

возвращается:

ответ

4

Нет. Попробуйте думать о приоритете не как о том, что получает «сначала оценивается», а больше о том, где вставлены скобки.

Тот факт, что $ имеет самый низкий приоритет, означает, что круглые скобки вставлены вокруг всего справа от него (и, отдельно, слева от него, если необходимо, но они здесь не нужны). Так

(2 ^) $ 2 + 2

эквивалентно

(2 ^) $ (2 + 2)

, который, конечно,

(2 ^) 4 (т. Е. 16)

+0

Так haskell оценивает право налево, как при добавлении скобок все термины имеют одинаковый приоритет? –

+3

На самом деле это немного сложнее: он всегда будет пытаться сначала оценить «внешнюю» функцию/оператор, а затем все, что ему нужно оценить, чтобы это сделать. Поэтому он попытается оценить '' 'first ', потому что это вне всех круглых скобок, но для этого ему нужно оценить' (2 ^) ', примененную к' (2 + 2) '; чтобы оценить, что он должен выработать «2 + 2», так что на практике это первая цифровая операция, которая выполняется, но на самом деле это не потому, что она идет справа налево. – psmears

2

правила старшинства могут сбивать с толку , но мне нравится думать об этом, поскольку «более низкий приоритет» означает «делать позже». Поскольку $ имеет самый низкий приоритет (например, ниже (+)), выполняется после(+). Таким образом, (2^) $ 2 + 2 оценивает (2^) частично примененной функции, затем оценивает 2+2 до 4, затем применяет 4 к 2^ для получения 16.

+0

Я имею тенденцию путаться о том, что означает «низкий» и «высокий» приоритет; это помогает мне думать о '' 'как обязательном отношении очень слабо, а' && 'привязывается более тесно, чем' || '. – amalloy

Смежные вопросы