Как объясняет ephemient, вы не можете использовать where
предложения так, как вы это делаете.
Ошибка происходит, потому что в этом коде:
main =
return [1..10] >>= \list ->
print list'
where
list' = reverse list
Предложение where
присоединено к основной функции.
Вот та же функция с большим количеством скобок:
main = return [1..10] >>= (\list -> print list')
where
list' = reverse list
Я думаю, совершенно очевидно, почему вы получаете ошибку "out of scope
": привязка для list
находится глубоко внутри выражения main
, а это не то, чего может достичь предложение where
.
Что я обычно делаю в этой ситуации (и меня укусило одно и то же несколько раз). Я просто представляю функцию и передаю list
в качестве аргумента.
main = do
list <- return [1..10]
let list' = f list
print list'
where
f list = reverse list -- Consider renaming list,
-- or writing in point-free style
Конечно, я представляю, что ваш реальный код в функции f
намного больше, чем просто reverse
, и поэтому вы хотите, чтобы он был внутри предложения where
вместо встроенной привязки let
. Если код внутри функции f
очень маленький, я просто напишу его внутри привязки let
и не буду тратить время на ввод новой функции.