Haskell 中使用 list monad 的所有元素对的列表

List of all element pairs using list monad in Haskell

我正在尝试使用列表 monad 使函数 pairs 生成给定列表中所有 不同 元素对的列表。我想使用 >>=do 表示法。

这是我目前所拥有的:

pairs :: Eq a => [a] -> [(a,a)]
pairs xs = [ (x,y) | (x:rest) <- tails xs , y <- rest ]

一些例子:

我已阅读 在 Haskell 中不重复地迭代所有对组合 .

使用do表示法:

pairs :: Eq a => [a] -> [(a,a)]
pairs xs = do
  a <- xs
  b <- xs
  if a == b
    then []
    else return (a, b)

并使用 bind (>>=):

pairs' :: Eq a => [a] -> [(a,a)]
pairs' xs =
  xs >>= \a ->
    xs >>= \b ->
      if a == b
        then []
        else [(a, b)]

两种解决方案是等价的。 Do 表示法只是 >>= 链的语法糖。