Эти строки выполнить правильно:
Prelude> 1/(1 + 1)
0.5
Prelude> (/) 1 $ (+) 1 1
0.5
Prelude> (/) 1 $ 1 + 1
0.5
Это один не делает:
Prelude> 1/$ (+) 1 1
<interactive>:1:4: parse error on input `$'
Почему?
Эти строки выполнить правильно:
Prelude> 1/(1 + 1)
0.5
Prelude> (/) 1 $ (+) 1 1
0.5
Prelude> (/) 1 $ 1 + 1
0.5
Это один не делает:
Prelude> 1/$ (+) 1 1
<interactive>:1:4: parse error on input `$'
Почему?
/является оператором инфикса. Это требует правильного выражения на обеих сторонах. 1
является буквальным и, следовательно, действительным выражением. Однако с правой стороны у вас есть сразу другой инфиксный оператор, которому требуется предшествовать другое действительное выражение (и 1 /
не является допустимым выражением, так как ему не хватает аргумента правой руки для оператора /). Вот почему парсер сообщает об ошибке (неверная грамматика - см. Отчет о haskell для уродливых деталей;)
Я считаю, что это потому, что $
- это оператор, которому требуется предшествующая ему функция. Выражение 1 /
в вашем последнем примере не оценивает функцию. В этом случае синтаксический анализатор ожидает найти (числовое) выражение в качестве второго аргумента оператору /
.
То, что вы описываете, является семантическим объяснением, а ghci возвращает ошибку парсера - это синтаксическая ошибка. (Примечание: я не утверждаю, что этот код должен работать;) –
Вы можете использовать раздел «оператор» для этого: '(1 /) $ (+) 1 1'. –