В haskell есть ли разница между let x = и x = в командной строке GHCi? - PullRequest
2 голосов
/ 21 сентября 2019

Я пишу простую декларацию в Haskell GHCi

myPi = 3.14

Я также могу написать это как

let myPi = 3.14

Есть ли разница для этого очень простого примера между двумя декларациями?Я знаю о дополнительной функциональности с let, но здесь она мне не нужна

Ответы [ 2 ]

6 голосов
/ 21 сентября 2019

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

> (3 +
<interactive>:1:5: error:
    parse error (possibly incorrect indentation or mismatched brackets)
>  case () of
<interactive>:2:1: error:
    Empty list of alternatives in case expression
      Use EmptyCase to allow this

После включения автоматического многострочного режима с помощью :set +m (установите его в ~/.ghci, чтобы включить его по умолчанию!):

> (3 +
| 4)
7
> case () of
|  () -> ()
|
()

Сиз этой преамбулы, теперь я могу сказать вам, в чем небольшая разница: myPi = 3.14 не запускает многострочную обработку, а определяет ее немедленно;но let myPi = 3.14 запускает многострочную обработку.Это может иметь значение, например, если вы хотите создать взаимно рекурсивные привязки;без let их нужно будет вводить в одну строку и разделять точными точками с запятой, тогда как в let и автоматическом многострочном режиме вы можете использовать отступы для их разделения стандартным идиоматическим способом.

(Кроме того, если вы используете очень старые версии GHC, форма, отличная от let, возможно, еще не была доступна.)

6 голосов
/ 21 сентября 2019

В приглашении GHCi нет, нет никакой разницы.

Раньше требовалось let (с учетом того, что приглашение GHCi немного похоже на ввод строк в IO сделать блок).Но относительно недавно 1 было обновлено, так что let является необязательным, чтобы обеспечить более удобный интерактивный синтаксис.


1 In GHC 8.0 (часть «Добавлена ​​поддержка объявлений функций верхнего уровня»).Он достаточно старый, поэтому вы вряд ли будете использовать более старую версию GHCi, для которой требуется let, но до этого еще было много учебников и других материалов (которые не всегда четко указывают, какая версия используетсяв своих примерах).И для некоторых людей старые привычки тяжело умирают.

...