首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我如何在Haskell中分离元组?

我如何在Haskell中分离元组?
EN

Stack Overflow用户
提问于 2013-10-24 18:01:25
回答 1查看 755关注 0票数 2

如何合并元组列表而不重复这些元组中的任何项?

例如:

从列表("a“、"b”)、( "c“、"d")、("a”、"b"),应该返回"a“、”b“、”c“、"d”

因此,我得到了这条错误信息和代码:

代码语言:javascript
复制
No instance for (Eq a0) arising from a use of `nub'
The type variable `a0' is ambiguous
Possible cause: the monomorphism restriction applied to the following:
  merge :: [(a0, a0)] -> [a0] (bound at P.hs:9:1)
Probable fix: give these definition(s) an explicit type signature
              or use -XNoMonomorphismRestriction
Note: there are several potential instances:
  instance Eq a => Eq (GHC.Real.Ratio a) -- Defined in `GHC.Real'
  instance Eq () -- Defined in `GHC.Classes'
  instance (Eq a, Eq b) => Eq (a, b) -- Defined in `GHC.Classes'
  ...plus 22 others
In the first argument of `(.)', namely `nub'
In the expression: nub . mergeTuples
In an equation for `merge':
    merge
      = nub . mergeTuples
      where
          mergeTuples = foldr (\ (a, b) r -> a : b : r) []

失败,模块加载:无。

EN

回答 1

Stack Overflow用户

发布于 2013-10-24 18:04:51

让我们把它分开,首先,合并元组

代码语言:javascript
复制
mergeTuples :: [(a, a)] -> [a]
mergeTuples = concatMap (\(a, b) -> [a, b]) -- Thanks Chuck
-- mergeTuples = foldr (\(a, b) r -> a : b : r) []

然后我们可以使用nub使它成为唯一的

代码语言:javascript
复制
merge :: Eq a => [(a, a)] -> [a]
merge = nub . mergeTuples

如果你想让这一切在一起

代码语言:javascript
复制
merge = nub . mergeTuples
  where mergeTuples = concatMap (\(a, b) -> [a, b])

或者如果你真的想把它粉碎(不要这样做)

代码语言:javascript
复制
merge [] = []
merge ((a, b) : r) = a : b : filter (\x -> x /= a && x /= b) (merge r)
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19573212

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档