понимание списка с несколькими аргументами - PullRequest
0 голосов
/ 19 марта 2019

Почему я не могу сделать это в Хаскеле?

[a * b | a <- [0..b], b <- [0..10]]

error: Variable not in scope: b

Если это невозможно, используя понимание списка? Или что еще я могу сделать для достижения цели?

Ответы [ 2 ]

11 голосов
/ 19 марта 2019

«Извлечения» обрабатываются слева направо, поэтому при попытке получить значение для 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)
4 голосов
/ 19 марта 2019

b должен находиться в области видимости до [0..b] part:

[a * b | b <- [0..10], a <- [0..b]]
...