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

时间:2018-05-06 13:12:39

标签: list haskell monads

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

这就是我现在所拥有的:

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

一些例子:

  • pairs [1] ==&gt; []
  • pairs [1,2] ==&gt; [(1,2),(2,1)]
  • pairs [1,2,3] ==&gt; [(1,2),(1,3),(2,1),(2,3),(3,1),(3,2)]

我已阅读Iterate over all pair combinations without repetition in Haskell

1 个答案:

答案 0 :(得分:2)

使用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)]

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