2010-07-21 4 views
1

Эти строки выполнить правильно:

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 `$' 

Почему?

+4

Вы можете использовать раздел «оператор» для этого: '(1 /) $ (+) 1 1'. –

ответ

15

/является оператором инфикса. Это требует правильного выражения на обеих сторонах. 1 является буквальным и, следовательно, действительным выражением. Однако с правой стороны у вас есть сразу другой инфиксный оператор, которому требуется предшествовать другое действительное выражение (и 1 / не является допустимым выражением, так как ему не хватает аргумента правой руки для оператора /). Вот почему парсер сообщает об ошибке (неверная грамматика - см. Отчет о haskell для уродливых деталей;)

1

Я считаю, что это потому, что $ - это оператор, которому требуется предшествующая ему функция. Выражение 1 / в вашем последнем примере не оценивает функцию. В этом случае синтаксический анализатор ожидает найти (числовое) выражение в качестве второго аргумента оператору /.

+1

То, что вы описываете, является семантическим объяснением, а ghci возвращает ошибку парсера - это синтаксическая ошибка. (Примечание: я не утверждаю, что этот код должен работать;) –

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