В Haskell можно сказатьПусть привязки в обозначении без макета требуют «в»?
main = do
let x = 5
print x
и это не будет компилироваться:
main = do
let x = 5
in print x
Но если я использую явное расположение, это не компилируется:
main = do {
let x = 5;
print x;
}
но это работает :
main = do {
let x = 5
in print x;
}
Я прав? Есть ли где-нибудь, где я могу больше узнать о явном макете и сделать и обозначить нотацию? Section 3.14 of the Haskell 98 report мне кажется, предположить, что мой третий пример должен работать, так как он говорит, что я могу написать
do { let DECLS; stmts }
и переводит
let DECLS in do { stmts }
Я ожидаю, что точка с запятой после '5' в вашем третьем примере анализируется как часть блока' let', а не блока 'do'. Но я не смотрел достаточно внимательно, чтобы быть уверенным. Вам также может понравиться раздел отчета о переводе от неявных к явным блокам. –
@ Даниэль Вагнер, вы на что-то там; он компилируется, если я делаю «let {x = 5};» –
Да, проблема здесь связана с смешиванием использования макета во внутренней let с явными скобками и точками с запятой во внешнем do. Как говорит Даниил, ';' рассматривается как часть деклараций 'let', а затем не может использоваться для разделения объявлений в' do'. Я думаю: '{{{x = 5}; ... 'действительно лучший способ« исправить »проблему. Другой вариант - поместить ';' после 'x = 5' в место, где он не может быть интерпретирован как часть' let'-layout, например, в начале следующей строки, слева от 'print x '. – kosmikus