В Haskell, когда мы используем in с let?

В следующем коде перед последней фразой я могу поставить in. Изменит ли это что-нибудь?

Еще один вопрос: Если я решу поставить in перед последней фразой, нужно ли делать отступ?

Я пробовал без отступов, и hugs жалуется

Последний генератор в do {...} должен быть выражением

import Data.Char
groupsOf _ [] = []
groupsOf n xs = 
    take n xs : groupsOf n ( tail xs )

problem_8 x = maximum . map product . groupsOf 5 $ x
main = do t <- readFile "p8.log" 
          let digits = map digitToInt $concat $ lines t
          print $ problem_8 digits

Edit

Ок, похоже, люди не понимают, что я говорю. Позвольте мне перефразировать: являются ли следующие два выражения одинаковыми, учитывая контекст выше?

1.

let digits = map digitToInt $concat $ lines t
print $ problem_8 digits

2.

let digits = map digitToInt $concat $ lines t
in print $ problem_8 digits

Еще один вопрос, касающийся области действия привязок, объявленных в let: здесь я читаю:

где Клаузулы.

Иногда удобно охватывать привязками несколько охраняемых уравнений, для чего требуется предложение where:

f x y  |  y>z           =  ...
       |  y==z          =  ...
       |  y

Обратите внимание, что это нельзя сделать с помощью выражения let, которое охватывает только выражение, которое оно окружает.

Мой вопрос: получается, что переменная digits не должна быть видна последней фразе print. Я что-то упустил?

56
задан nbro 15 March 2017 в 14:50
поделиться