哈斯克尔。如何计算两个字符串列表之间的差异?

时间:2017-09-02 16:06:29

标签: haskell compare difference

我有一个问题可以说是这种情况。

有三种不同类别的书:医学书,艺术书和历史书。 每本书都有三个级别:小学,中级,高级。

这些书将放在书架上 问题是比较两个不同书架的差异。

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

例如:

  • 医学书籍 - >中号
  • 艺术书籍 - >一个
  • 历史书 - > ħ

  • 小学 - > 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 ...

  • 1 个答案:

    答案 0 :(得分:1)

    您想要的功能位于Data.List module,因此请将其导入。您还需要Data.Function中的toString功能。

    不要将书籍表示为像" H1"这样的双元素列表,而应将它们配对:on。它让生活变得更轻松,而且你不必担心无效的头衔。

    你问题的最后一点说你从来没有在书架上有两本书。这意味着每个书架都是一套书。 ('H', 1)模块包含一些设置功能。例如,两个列表中相同的书籍由Data.List给出,而一个书架而不是另一个书架上的书籍由intersect给出。您还可以使用这些函数的(\\)变体,例如By。其中每个都使用函数而不是intersectBy。如果您按照我上面的建议代表一对书,那么您可以构建这样的函数:

    (==)