我正在尝试使用列表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 。
答案 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)]
两种解决方案都是等效的。表示法只是>>=
链的语法糖。