【问题标题】:Haskell. How to calculate the difference between two lists of string?哈斯克尔。如何计算两个字符串列表之间的差异?
【发布时间】:2017-09-02 16:06:28
【问题描述】:

我有一个问题可以描述为这种情况。

书籍分为三类:医学书籍、艺术书籍和历史书籍。 每本书分为三个级别:初级、中级、高级。

这些书将被放在书架上。
问题是比较两个不同书架的区别。

我已将这个问题抽象为两个字符串列表。

例如:


  • 医书-> M
  • 艺术书 -> A
  • 历史书 -> H

  • 初级 -> 1
  • 中级 -> 2
  • 高级 -> 3

    现在,书架可以定义为 ["A1","H2","M3"]。
    问题:

      有多少本书是一样的? (同类别同级别)
      有多少本书的类别相同但级别错误?(不包括同一本书)
      有多少本书的级别相同但类别错误?(不包括同一本书)

    顺便说一句,相同的书籍不会放在同一个书架上,这意味着列表中的每个元素都是唯一的,并且与书籍的顺序无关。

    例子

    ["A1","H2","M3"] ["A1","H3","A2"] -> (1 same book, 1 same category book,  2 same level books)  -> (1,1,2)
    ["H3","M2","A2"] ["H2","M1","H1"] -> (0 same book, 2 same category books, 1 same level book)   -> (0,2,1)
    ["A1","H1","M1"] ["A2","H2","M2"] -> (0 same book, 3 same catefory books, 0 same level book)   -> (0,3,0)
    

    当我用不同级别的相同类别的书或不同类别的相同级别的书时,有时我会得到3个以上...

  • 【问题讨论】:

    • 我不明白为什么例如第一个示例只有一个 same category 书?
    • 你试过什么?你有一些代码吗?如果它不编译,错误是什么?如果是这样,它不起作用的输入/输出对是什么?这个问题没有显示解决问题的努力,这使得它脱离主题。
    • 第一个例子,因为A1已经被算作同一本书(同类别同级别),所以只有H2和H3同类别不同级别。
    • @user2407038 当我尝试统计同一类别但级别错误的书籍和相同级别但类别错误的书籍时,有时同一类别或同一级别会计算不止一次。比如,["A1","H3","M3"] 和 ["A1","H3","M1"],正确答案是 (1,2,1),但我得到 (1,2, 2),级别'3'被计算两次......

    标签: haskell compare difference


    【解决方案1】:

    你想要的函数在Data.List module,所以导入它。您还需要来自Data.Functionon 函数。

    与其将书籍表示为像“H1”这样的二元素列表,不如将它们配对:('H', 1)。它让生活变得更轻松,而且您不必担心无效的标题。

    您的问题的最后一点是,您的书架上永远不会有两本书籍。这意味着每个书架都是一套书。 Data.List 模块包含一些集合函数。例如,两个列表中相同的书由intersect 给出,一个书架上但不是另一个书架的书由(\\) 给出。您还可以使用这些函数的By 变体,例如intersectBy。其中每一个都需要一个函数来代替(==)。如果你按照我上面的建议用一对来表示一本书,那么你可以像这样构造这些函数:

    zs = intersectBy ((==) `on` fst) xs ys
    

    【讨论】:

      猜你喜欢
      • 2012-11-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多