Функция со стражами: синтаксическая ошибка при использовании «где» - PullRequest
2 голосов
/ 28 октября 2019

MWE:

import Control.Monad.State.Lazy

fibStep :: State (Integer, Integer) ()
fibStep = state $ \(a, b) -> ((), (b, a + b))

execStateN :: Int -> State s a -> s -> s
execStateN n m s
  | n == 1 = execState m s
  | n > 1 = let s' = execState m s in
              execStateN (n - 1) m s'
  -- | n > 1 = execStateN (n - 1) m s' where s' = execState m s
  | otherwise = error "undefined behaviour"

Это работает, но как только я раскомментирую вариант where и прокомментирую вариант let, выдается синтаксическая ошибка:

error: parse error on input '|'

Я проверил отступы, они в порядке. Что не так?

1 Ответ

6 голосов
/ 28 октября 2019

where охватывает все охранники, поэтому вы помещаете его в конец охранников, как:

execStateN :: Int -> State s a -> s -> s
execStateN n m s
  | n == 1 = execState m s
  | n > 1 = execStateN (n - 1) m s'
  | otherwise = error "undefined behaviour"
  <b>where</b> s' = execState m s
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...