Условно говоря, в одном случае ты берёшь любое значение из списка и возвращаешь его пару с самим собой, а в другом ты берёшь одно любое число и другое любое число, делая пару из них — вот из-за этого и получаются все пары. Для списков можно использовать вместо do-нотации такую запись: another i = [(indice, indice) | indice <- [1..i]] another' i = [(indice, indice') | indice <- [1..i], indice' <- [1..i]] Как видишь, тут буквально записано, что во втором случае мы получаем пары произвольных чисел. P.S. Что мы имеем, если избавимся от do-нотации: pure x = [x] xs >>= f = [y | x <- xs, y <- f x] another i = [1..i] >>= (\indices -> pure (indices, indices)) another' i = [1..i] >>= (\indices -> [1..i] >>= (\indices1 -> pure (indices, indices))) Переписываем: another i = [y | x <- [1..i], y <- [(x,x)]] = [(x,x) | x <- [1..i]] another' i = [y | x <- [1..i], y <- [y' | x' <- [1..i], y' <- [(x,x')]] = [y | x <- [1..i], y <- [(x,x') | x' <- [1..i]]] = [(x,x') | x <- [1..i], x' <- [1..i]]
Спасибо большое,когда переписано с помощью лямбды,то все становится понятно
всё правильно, только indices в единственном числе будет index
Точно, спасибо. Даже странно, что я так ошибся.
Обсуждают сегодня