«Извлечения» обрабатываются слева направо, поэтому при попытке получить значение для a
, b
еще не определено .
Списокпонимание - всего лишь синтаксический сахар для следующего монадического кода, что упрощает понимание того, почему b
еще не находится в области действия.
-- [a * b | a <- [0..b], b <- [0..10]]
[0..b] >>= \a -> [0..10] >>= \b -> return (a * b)
Переверните его, и b
входит в область действия:
-- [a * b | b <- [0..10], a <- [0..b]]
[0..10] >>= \b -> [0..b] >>= \a -> return (a*b)