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 ]
一些例子:
pairs [1]
==> []
pairs [1,2]
==> [(1,2),(2,1)]
pairs [1,2,3]
==> [(1,2),(1,3),(2,1),(2,3),(3,1),(3,2)]
我已阅读 在 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 表示法只是 >>=
链的语法糖。
我正在尝试使用列表 monad 使函数 pairs
生成给定列表中所有 不同 元素对的列表。我想使用 >>=
或 do
表示法。
这是我目前所拥有的:
pairs :: Eq a => [a] -> [(a,a)]
pairs xs = [ (x,y) | (x:rest) <- tails xs , y <- rest ]
一些例子:
pairs [1]
==>[]
pairs [1,2]
==>[(1,2),(2,1)]
pairs [1,2,3]
==>[(1,2),(1,3),(2,1),(2,3),(3,1),(3,2)]
我已阅读 在 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 表示法只是 >>=
链的语法糖。