Ну, вы уже получили несколько ответов, но я собираюсь бросить в шахте, потому что я думаю, что более ранние, в то время как все точные, может оказаться недостаточно полезным.
Самое простое решение вы получили для новичка, чтобы понять список понимание:
example1 = [ x*y | x <- list, y <- list ]
Этот синтаксис существует в некоторых популярных языков, таких как Python, и должно быть легко понять, в любом случае: « список, элементами которого являются результаты x*y
, где x
является элементом list
и y
является элементом list
. " Вы можете также добавить условия в списковые, чтобы отфильтровать некоторые комбинации, например, если вы не хотите продуктов, где x == y
:
example2 = [ x*y | x <- list, y <- list, x /= y ]
Более сложные ответы должны делать с тем, что списочные эквивалентнами Список Monad; реализация стандартного класса Monad
для типа списка. Это означает, что example1
также может быть реализован следующими способами:
example1' = do x <- list
y <- list
return (x*y)
do
-notation только синтаксисом для этого:
example1'' = list >>= (\x -> list >>= (\y -> return (x*y)))
ответ Landei основывается на том факте, что, если вы не используя любые условия в вашем понимании списка, только декартовские продукты, вы можете уйти с использованием класса класса Applicative
, который слабее, чем Monad
.
Почему ваш пример не включает '2 * 2' в результат? Возможно, вам не нужны дубликаты. Но тогда почему ваш пример не включает '3 * 3' в результат? – dave4420
Это была опечатка, спасибо! Сейчас обновлено – ryanmehta