【问题标题】:haskell list of tuples, with unique tupleshaskell 元组列表,具有唯一的元组
【发布时间】:2012-01-09 02:49:24
【问题描述】:

我来自 Python 和 Java 背景,所以 Haskell 对我来说完全不同。我正在尝试一些小活动来学习,但我一直坚持这一点。

我有一个有序的元组列表 [(name, studentNumber)],我想过滤这个列表,以便每个学生和每个 studentNumber 只出现一次。由于元组是有序的,我想保留 name 或 studentNumber 的第一个实例,并删除可能出现的任何其他实例。

我尝试进行列表理解,但我不确定如何检查名称或号码是否已添加到列表中。

【问题讨论】:

  • 最简单的解决方案是nub,但由于它不能依赖于被排序的列表(你的意思是,对吗?列表总是有序的,所以明确说明这一点没有意义),它会(除非我大错特错)不如针对这种情况量身定制的东西有效。
  • 如果这是输入,输出应该是什么? [("Anne", 3), ("Anne", 5), ("Bob", 5)]
  • 我的意思是这样排序,第一个元组表示他们是第一个注册的学生,第二个元组是第二个学生,依此类推。我需要保留这个订单!
  • @dave4420 它应该输出 [("Anne", 3), ("Bob", 5)]
  • 您可能还想看看Data.SetData.Map...

标签: list haskell tuples list-comprehension


【解决方案1】:

听起来你想要(作为第一个低效的近似值)这样的东西:

import Data.List (nubBy)
import Data.Function (on)

filt = nubBy ((==) `on` snd) . nubBy ((==) `on` fst)

第一次调用nubBy 将生成一个列表,其中每个名称只出现一次,然后将其传递给第二个,生成一个每个数字只出现一次的列表。

仅使用nub 将产生一个列表,其中每个(name,number) 对只出现一次;可能仍然会重复使用不同数字的名称和不同名称的数字。

(当然,带有累加器的自定义会更快。)

【讨论】:

  • 谢谢!我在另一篇 SO 帖子上找到了 nubBy,但我想的还不够远!这很好用,谢谢!
【解决方案2】:

您可以监视Data.List sources 并编写您的扩展nub 函数:

type Student = (Name, Number)
type Name = String
type Number = Int

unique :: [Student] -> [Student]
unique = go [] [] 
  where
    go unames unumbers (s@(name, number):ss)
      | name `elem` unames || number `elem` unumbers = go unames unumbers ss
      | otherwise = s : go (name:unames) (number:unumbers) ss
    go _ _ [] = []

应该做你想做的。

【讨论】:

    【解决方案3】:

    为了使列表唯一化,前奏中总是有 nub 函数,我认为这应该完全符合您的需要!

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-31
    • 1970-01-01
    相关资源
    最近更新 更多